1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2024 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport m from 'mithril'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {Button} from './button'; 17*6dbdd20aSAndroid Build Coastguard Workerimport {HTMLAttrs} from './common'; 18*6dbdd20aSAndroid Build Coastguard Worker 19*6dbdd20aSAndroid Build Coastguard Workerinterface IconOption { 20*6dbdd20aSAndroid Build Coastguard Worker // Icon buttons require an icon. 21*6dbdd20aSAndroid Build Coastguard Worker readonly icon: string; 22*6dbdd20aSAndroid Build Coastguard Worker} 23*6dbdd20aSAndroid Build Coastguard Worker 24*6dbdd20aSAndroid Build Coastguard Workerinterface LabelOption { 25*6dbdd20aSAndroid Build Coastguard Worker // Label buttons require a label. 26*6dbdd20aSAndroid Build Coastguard Worker readonly label: string; 27*6dbdd20aSAndroid Build Coastguard Worker // Label buttons can have an optional icon. 28*6dbdd20aSAndroid Build Coastguard Worker readonly icon?: string; 29*6dbdd20aSAndroid Build Coastguard Worker} 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Workertype Option = LabelOption | IconOption; 32*6dbdd20aSAndroid Build Coastguard Worker 33*6dbdd20aSAndroid Build Coastguard Workerexport interface SegmentedButtonsAttrs extends HTMLAttrs { 34*6dbdd20aSAndroid Build Coastguard Worker // Options for segmented buttons. 35*6dbdd20aSAndroid Build Coastguard Worker readonly options: ReadonlyArray<Option>; 36*6dbdd20aSAndroid Build Coastguard Worker 37*6dbdd20aSAndroid Build Coastguard Worker // The index of the selected button. 38*6dbdd20aSAndroid Build Coastguard Worker readonly selectedOption: number; 39*6dbdd20aSAndroid Build Coastguard Worker 40*6dbdd20aSAndroid Build Coastguard Worker // Callback function which is called every time a 41*6dbdd20aSAndroid Build Coastguard Worker readonly onOptionSelected: (num: number) => void; 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard Worker // Whether the segmented buttons is disabled. 44*6dbdd20aSAndroid Build Coastguard Worker // false by default. 45*6dbdd20aSAndroid Build Coastguard Worker readonly disabled?: boolean; 46*6dbdd20aSAndroid Build Coastguard Worker} 47*6dbdd20aSAndroid Build Coastguard Worker 48*6dbdd20aSAndroid Build Coastguard Workerexport class SegmentedButtons 49*6dbdd20aSAndroid Build Coastguard Worker implements m.ClassComponent<SegmentedButtonsAttrs> 50*6dbdd20aSAndroid Build Coastguard Worker{ 51*6dbdd20aSAndroid Build Coastguard Worker view({attrs}: m.CVnode<SegmentedButtonsAttrs>) { 52*6dbdd20aSAndroid Build Coastguard Worker const {options, selectedOption, disabled, onOptionSelected, ...htmlAttrs} = 53*6dbdd20aSAndroid Build Coastguard Worker attrs; 54*6dbdd20aSAndroid Build Coastguard Worker return m( 55*6dbdd20aSAndroid Build Coastguard Worker '.pf-segmented-buttons', 56*6dbdd20aSAndroid Build Coastguard Worker htmlAttrs, 57*6dbdd20aSAndroid Build Coastguard Worker options.map((o, i) => 58*6dbdd20aSAndroid Build Coastguard Worker m(Button, { 59*6dbdd20aSAndroid Build Coastguard Worker ...o, 60*6dbdd20aSAndroid Build Coastguard Worker disabled: disabled, 61*6dbdd20aSAndroid Build Coastguard Worker active: i === selectedOption, 62*6dbdd20aSAndroid Build Coastguard Worker onclick: () => onOptionSelected(i), 63*6dbdd20aSAndroid Build Coastguard Worker }), 64*6dbdd20aSAndroid Build Coastguard Worker ), 65*6dbdd20aSAndroid Build Coastguard Worker ); 66*6dbdd20aSAndroid Build Coastguard Worker } 67*6dbdd20aSAndroid Build Coastguard Worker} 68