def card_place_order(q: Q) -> ui.FormCard: item_list = [] for i, item in enumerate(q.client.items.keys()): text = ui.text_xl(f'{item}') gpo_order = ui.slider(name=f'gpo_order_{i}', label='How many to order from GPO?', min=0, max=q.client.items[item].max_storage, value=random.randint(0, q.client.max_storage)) alt_order = ui.slider(name=f'alt_order_{i}', label='How many to order from alt?', min=0, max=q.client.items[item].max_storage, value=random.randint(0, q.client.max_storage)) item_list.extend([text, gpo_order, alt_order]) buttons = ui.buttons([ ui.button(name='make_order', label='Place Order', primary=True), ui.button(name='go_home', label='Back', primary=True) ]) item_list.append(buttons) card = ui.FormCard( box=box_sidebar, items=item_list, ) return card
async def serve(q: Q): if not q.client.initialized: # First visit q.client.initialized = True q.client.points = 25 q.client.alpha = 50 q.page['controls'] = ui.form_card( box='1 1 2 3', items=[ ui.text_xl("Lets make some plots"), ui.slider(name='points', label='Points', min=5, max=50, step=1, value=q.client.points, trigger=True), ui.slider(name='alpha', label='Alpha', min=5, max=100, step=1, value=q.client.alpha, trigger=True), ]) q.page['plot'] = ui.markdown_card(box='3 1 2 3', title='Your plot!', content='') if q.args.points is not None: q.client.points = q.args.points if q.args.alpha is not None: q.client.alpha = q.args.alpha n = q.client.points # Render plot plt.figure(figsize=(2, 2)) plt.scatter(np.random.rand(n), np.random.rand(n), s=(30 * np.random.rand(n))**2, c=np.random.rand(n), alpha=q.client.alpha / 100.0) image_filename = f'{str(uuid.uuid4())}.png' plt.savefig(image_filename) # Upload image_path, = await q.site.upload([image_filename]) # Clean up os.remove(image_filename) # Display our plot in our markdown card q.page['plot'].content = f'![plot]({image_path})' # Save page await q.page.save()
async def serve(q: Q): if not q.client.initialized: q.page['meta'] = ui.meta_card(box='', theme='neon') q.page['controls'] = ui.form_card(box='1 1 2 8', items=[ ui.text_xl('Form'), ui.textbox(name='textbox', label='Textbox'), ui.toggle(name='toggle', label='Toggle'), ui.choice_group(name='choice_group', label='Choice group', choices=[ ui.choice(name=x, label=x) for x in ['Egg', 'Bacon', 'Spam'] ]), ui.checklist(name='checklist', label='Checklist', choices=[ ui.choice(name=x, label=x) for x in ['Egg', 'Bacon', 'Spam'] ]), ui.dropdown(name='dropdown', label='Dropdown', choices=[ ui.choice(name=x, label=x) for x in ['Egg', 'Bacon', 'Spam'] ]), ui.slider(name='slider', label='Slider'), ui.button(name='toggle_theme', label='Toggle Theme', primary=True) ]) q.client.theme = 'default' q.client.initialized = True meta = q.page['meta'] if q.args.toggle_theme: meta.theme = q.client.theme = 'neon' if q.client.theme == 'default' else 'default' await q.page.save()
async def serve(q: Q): hilbert_curve = make_hilbert_curve(300, q.args.depth or 5) if not q.client.initialized: q.page['curve'] = ui.graphics_card( box='1 1 4 6', view_box='0 0 300 300', width='100%', height='100%', scene=g.scene(hilbert_curve=g.path( d=hilbert_curve, fill='none', stroke='#333')), ) q.page['form'] = ui.form_card( box='1 7 4 1', items=[ ui.slider(name='depth', label='Play with this Hilbert curve!', min=1, max=6, value=5, trigger=True), ], ) q.client.initialized = True else: g.draw(q.page['curve'].scene.hilbert_curve, d=hilbert_curve) await q.page.save()
async def get_inputs(q: Q): q.page['main'] = ui.form_card( box="1 2 8 5", items=[ ui.text_xl('Enter your text input for generation:'), ui.textbox(name="input_text", label='', value=q.app.input_text, multiline=True), ui.separator(), ui.slider( name="num_words_to_generate", label= "Maximum number of words to generate (including input text)", min=5, max=50, step=1, value=q.app.num_words_to_generate if q.app.num_words_to_generate else 12, ), ui.separator(), ui.buttons([ ui.button(name="generate_text", label='Generate', primary=True), ]) ])
async def start_new_game(q: Q): q.client.game = Game(q.user.player.player_id) q.user.player.games[q.client.game.game_id] = q.client.game q.page['starting_game'] = ui.form_card( box='4 4 3 3', items=[ ui.text_l('I am thinking of a number between 1 and 100'), ui.text_m('can you guess what it is?'), ui.text_xs('Рађ'), ui.slider( name='guess', label='your guess', min=1, max=100, value=100, trigger=True, ), ui.text_xs('Рађ'), ui.buttons( items=[ ui.button(name='quit_game', label='Quit', primary=True) ], justify='center', ), ], ) await q.page.save()
async def serve(q: Q): if not q.client.initialized: # First visit q.client.initialized = True q.client.points = 25 q.client.plotly_controls = False q.page['controls'] = ui.form_card(box='1 1 4 2', items=[ ui.slider(name='points', label='Points', min=5, max=50, step=1, value=q.client.points, trigger=True), ui.toggle( name='plotly_controls', label='Plotly Controls', trigger=True), ]) q.page['plot'] = ui.frame_card(box='1 3 4 5', title='', content='') if q.args.points: q.client.points = q.args.points if q.args.plotly_controls is not None: q.client.plotly_controls = q.args.plotly_controls n = q.client.points # Create plot with plotly fig = go.Figure(data=go.Scatter( x=np.random.rand(n), y=np.random.rand(n), mode='markers', marker=dict(size=(8 * np.random.rand(n))**2, color=np.random.rand(n)), opacity=0.8, )) _ = fig.update_layout( margin=dict(l=10, r=10, t=10, b=10), paper_bgcolor='rgb(255, 255, 255)', plot_bgcolor='rgb(255, 255, 255)', ) config = { 'scrollZoom': q.client.plotly_controls, 'showLink': q.client.plotly_controls, 'displayModeBar': q.client.plotly_controls } html = pio.to_html(fig, validate=False, include_plotlyjs='cdn', config=config) q.page['plot'].content = html # Save page await q.page.save()
def form_default(q: Q): # display when app is initialized return [ ui.text(content=DATASET_TEXT), ui.dropdown(name='dai_instance_id', label='Select Driverless AI instance', value=q.client.dai_instance_id, choices=q.client.choices_dai_instances, required=True), ui.text(content=STEAM_TEXT, visible=q.client.disable_training), ui.slider(name='dai_interpretability', label='Interpretability', min=1, max=10, step=1, value=7), ui.toggle(name='dai_reproducible', label='Reproducible', value=False), ui.buttons(items=[ ui.button(name='train', label='Train', primary=True, disabled=q.client.disable_training), ui.button(name='predict', label='Predict', primary=True, disabled=True), ]) ]
async def show_slider(q: Q, message: str): q.page['output'] = ui.form_card(box='1 1 3 2', title="Party Meter", items=[ ui.slider( name='temperature', label='Temperature (°C)', max=50, value=q.args.temperature, trigger=True, ), ui.text(message), ]) await q.page.save()
async def serve(q: Q): if q.args.show_inputs: q.page['example'].items = [ ui.text(f'slider={q.args.slider}'), ui.text(f'slider_zero={q.args.slider_zero}'), ui.text(f'slider_disabled={q.args.slider_disabled}'), ui.button(name='show_form', label='Back', primary=True), ] else: q.page['example'] = ui.form_card(box='1 1 4 10', items=[ ui.slider(name='slider', label='Standard slider', min=0, max=100, step=10, value=30), ui.slider( name='slider_zero', label='Origin from zero', min=-10, max=10, step=1, value=-3), ui.slider(name='slider_disabled', label='Disabled slider', min=0, max=100, step=10, value=30, disabled=True), ui.button(name='show_inputs', label='Submit', primary=True), ]) await q.page.save()
def form_training_completed(q: Q): # display when model training is completed return [ ui.text(content=DATASET_TEXT), ui.dropdown(name='dai_instance_id', label='Select Driverless AI instance', value=q.client.dai_instance_id, choices=q.client.choices_dai_instances, required=True), ui.slider(name='dai_interpretability', label='Interpretability', min=1, max=10, step=1, value=q.client.dai_interpretability), ui.toggle(name='dai_reproducible', label='Reproducible', value=q.client.dai_reproducible), ui.buttons(items=[ ui.button(name='train', label='Train', primary=True), ui.button(name='predict', label='Predict', primary=True) ]), ui.message_bar(type='success', text='Training successfully completed!'), ui.text(content=q.client.model_details) ]
def form_training_progress(q: Q): # display when model training is in progress return [ ui.text(content=DATASET_TEXT), ui.dropdown(name='dai_instance_id', label='Select Driverless AI instance', value=q.client.dai_instance_id, choices=q.client.choices_dai_instances, required=True), ui.slider(name='dai_interpretability', label='Interpretability', min=1, max=10, step=1, value=q.client.dai_interpretability), ui.toggle(name='dai_reproducible', label='Reproducible', value=q.client.dai_reproducible), ui.buttons(items=[ ui.button(name='train', label='Train', primary=True, disabled=True), ui.button(name='predict', label='Predict', primary=True, disabled=True) ]), ui.progress(label='Training in progress...', caption='This can take a few minutes...'), ui.text(content=q.client.model_details) ]
def get_user_input_items(sales_data, user_inputs, progress=False): return [ ui.text_l('**Select Area of Interest**'), ui.dropdown( name='stores', label='Store IDs', values=[str(x) for x in user_inputs.stores], choices=[ui.choice(name=str(x), label=str(x)) for x in sales_data.stores_unique], tooltip='Select the Stores to include in the prediction', trigger=True, ), ui.text_xs('⠀'), ui.dropdown( name='departments', label='Product IDs', values=[str(x) for x in user_inputs.departments], choices=[ui.choice(name=str(x), label=str(x)) for x in sales_data.departments_unique], tooltip='Select the Products to include in the prediction', trigger=True, ), ui.frame(content=' ', height="40px"), ui.text_l('**Generate Sales Forecast**'), ui.slider( name='n_forecast_weeks', label='Number of Weeks', min=0, max=len(sales_data.prediction_dates) - 1, step=1, value=user_inputs.n_forecast_weeks, trigger=True, tooltip='Select the number of weeks into the future to predict' ), ui.text_xs('⠀'), ui.button( name='reset', label='Reset', primary=True, tooltip='Click to reset all values to defaults' ), ui.text_xs('⠀'), ui.progress(label='', caption='', visible=progress), ]
def get_user_input_items(sales_data, user_inputs, progress=False): return [ ui.text_l('**Prediction Configuration**'), ui.dropdown( name='stores', label='Store IDs', values=[str(x) for x in user_inputs.stores], choices=[ ui.choice(name=str(x), label=str(x)) for x in sales_data.stores_unique ], trigger=True, ), ui.dropdown( name='departments', label='Product IDs', values=[str(x) for x in user_inputs.departments], choices=[ ui.choice(name=str(x), label=str(x)) for x in sales_data.departments_unique ], trigger=True, ), ui.slider( name='n_forecast_weeks', label='Weeks to predict', min=0, max=len(sales_data.prediction_dates) - 1, step=1, value=user_inputs.n_forecast_weeks, trigger=True, ), ui.button(name='reset', label='Reset', primary=True, tooltip='Click to reset all values to defaults'), ui.progress(label='', caption='', visible=progress), ]
async def serve(q: Q): if q.args.generate_csv: # Generate write_csv('squares.csv', [[x, x * x] for x in range(1, 1 + q.args.row_count)]) # Upload download_path, = await q.site.upload(['squares.csv']) # Clean up os.remove('squares.csv') # Display link q.page['example'].items = [ ui.text_xl('Squares Generated!'), ui.text(f'[Download my {q.args.row_count} squares!]({download_path})'), ui.button(name='show_form', label='Back', primary=True), ] else: # Accept a row count from the user q.page['example'] = ui.form_card(box='1 1 4 10', items=[ ui.text_xl('Square Generator'), ui.slider(name='row_count', label='Squares to generate', min=0, max=100, step=10, value=30), ui.button(name='generate_csv', label='Generate', primary=True), ]) await q.page.save()
async def serve(q: Q): if not q.client.initialized: image = 'https://images.pexels.com/photos/220453/pexels-photo-220453.jpeg?auto=compress&h=750&w=1260' f = FakeCategoricalSeries() q.client.primary = '#000000' q.client.page = '#e2e2e2' q.client.card = '#ffffff' q.client.text = '#000000' q.page['meta'] = ui.meta_card( box='', theme='custom', layouts=[ ui.layout(breakpoint='xs', zones=[ ui.zone('header'), ui.zone('content', direction=ui.ZoneDirection.ROW, zones=[ ui.zone('colors', size='340px'), ui.zone('preview') ]), ui.zone('footer') ]) ]) q.page['header'] = ui.header_card(box='header', title='Theme generator', subtitle='Color your app easily', icon='Color', icon_color='$card') q.page['form'] = ui.form_card(box='colors', items=[ ui.color_picker( name='primary', label='Primary', trigger=True, alpha=False, inline=True, value=q.client.primary), ui.color_picker(name='text', label='Text', trigger=True, alpha=False, inline=True, value=q.client.text), ui.color_picker(name='card', label='Card', trigger=True, alpha=False, inline=True, value=q.client.card), ui.color_picker(name='page', label='Page', trigger=True, alpha=False, inline=True, value=q.client.page), ui.text_xl('Check contrast'), get_contrast('text', 'card', q), get_contrast('card', 'primary', q), get_contrast('text', 'page', q), get_contrast('page', 'primary', q), ui.text_xl('Copy code'), ui.frame(content=get_theme_code(q), height='180px'), ]) q.page['sample'] = ui.form_card( box='preview', items=[ ui.text_xl(content='Sample App to show colors'), ui.progress(label='A progress bar'), ui.inline([ ui.checkbox(name='checkbox1', label='A checkbox', value=True), ui.checkbox(name='checkbox2', label='Another checkbox'), ui.checkbox(name='checkbox3', label='Yet another checkbox'), ui.toggle(name='toggle', label='Toggle', value=True), ]), ui.inline([ ui.date_picker(name='date_picker', label='Date picker'), ui.picker(name='picker', label='Picker', choices=[ ui.choice('choice1', label='Choice 1'), ui.choice('choice2', label='Choice 2'), ui.choice('choice3', label='Choice 3'), ]), ui.combobox(name='combobox', label='Combobox', choices=['Choice 1', 'Choice 2', 'Choice 3']), ui.persona(title='John Doe', subtitle='Data Scientist', size='s', image=image), ]), ui.slider(name='slider', label='Slider', value=70), ui.link(label='Link'), ui.inline(justify='between', items=[ ui.stepper(name='stepper', width='500px', items=[ ui.step(label='Step 1', icon='MailLowImportance'), ui.step( label='Step 2', icon='TaskManagerMirrored'), ui.step(label='Step 3', icon='Cafe'), ]), ui.tabs(name='menu', value='email', items=[ ui.tab(name='email', label='Mail', icon='Mail'), ui.tab(name='events', label='Events', icon='Calendar'), ui.tab(name='spam', label='Spam'), ]), ]), ui.inline(items=[ ui.table( name='table', width='50%', columns=[ ui.table_column( name='name', label='Name', min_width='80px'), ui.table_column(name='surname', label='Surname', filterable=True), ui.table_column(name='age', label='Age', sortable=True), ui.table_column( name='progress', label='Progress', cell_type=ui.progress_table_cell_type( color='$themePrimary')), ], rows=[ ui.table_row(name='row1', cells=['John', 'Doe', '25', '0.90']), ui.table_row(name='row2', cells=['Ann', 'Doe', '35', '0.75']), ui.table_row( name='row3', cells=['Casey', 'Smith', '40', '0.33']), ], height='330px', ), ui.visualization( width='50%', plot=ui.plot([ ui.mark(type='interval', x='=product', y='=price', y_min=0) ]), data=data(fields='product price', rows=[(c, x) for c, x, _ in [f.next() for _ in range(20)]], pack=True), ), ]), ui.buttons([ ui.button(name='primary_button', label='Primary', primary=True), ui.button(name='standard_button', label='Standard'), ui.button(name='standard_disabled_button', label='Disabled', disabled=True), ui.button(name='icon_button', icon='Heart', caption='Tooltip text'), ]), ]) q.page['footer'] = ui.footer_card( box='footer', caption='(c) 2021 H2O.ai. All rights reserved.') q.client.themes = [ ui.theme(name='custom', text=q.client.text, card=q.client.card, page=q.client.page, primary=q.client.primary) ] q.client.initialized = True if q.args.primary: q.client.themes[0].primary = q.args.primary q.client.primary = q.args.primary if q.args.text: q.client.themes[0].text = q.args.text q.client.text = q.args.text if q.args.card: q.client.themes[0].card = q.args.card q.client.card = q.args.card if q.args.page: q.client.themes[0].page = q.args.page q.client.page = q.args.page q.page['meta'].themes = q.client.themes q.page['form'].items[5] = get_contrast('text', 'card', q) q.page['form'].items[6] = get_contrast('card', 'primary', q) q.page['form'].items[7] = get_contrast('text', 'page', q) q.page['form'].items[8] = get_contrast('page', 'primary', q) q.page['form'].items[10].frame.content = get_theme_code(q) await q.page.save()
async def serve(q: Q): q.page['example'] = ui.form_card(box='1 1 4 10', items=[ ui.text_xl(content='Extra-large text, for headings.'), ui.text_l(content='Large text, for sub-headings.'), ui.text_m(content='Body text, for paragraphs and other content.'), ui.text_s(content='Small text, for small print.'), ui.text_xs(content='Extra-small text, for really small print.'), ui.separator(label='A separator sections forms'), ui.progress(label='A progress bar'), ui.progress(label='A progress bar'), ui.message_bar(type='success', text='Message bar'), ui.textbox(name='textbox', label='Textbox'), ui.label(label='Checkboxes'), ui.checkbox(name='checkbox1', label='A checkbox'), ui.checkbox(name='checkbox1', label='Another checkbox'), ui.checkbox(name='checkbox1', label='Yet another checkbox'), ui.toggle(name='toggle', label='Toggle'), ui.choice_group(name='choice_group', label='Choice group', choices=[ ui.choice(name=x, label=x) for x in ['Egg', 'Bacon', 'Spam'] ]), ui.checklist(name='checklist', label='Checklist', choices=[ ui.choice(name=x, label=x) for x in ['Egg', 'Bacon', 'Spam'] ]), ui.dropdown(name='dropdown', label='Dropdown', choices=[ ui.choice(name=x, label=x) for x in ['Egg', 'Bacon', 'Spam'] ]), ui.dropdown(name='dropdown', label='Multi-valued Dropdown', values=[], choices=[ ui.choice(name=x, label=x) for x in ['Egg', 'Bacon', 'Spam'] ]), ui.combobox(name='combobox', label='Combobox', choices=['Choice 1', 'Choice 2', 'Choice 3']), ui.slider(name='slider', label='Slider'), ui.range_slider(name='range_slider', label='Range slider', max=99), ui.spinbox(name='spinbox', label='Spinbox'), ui.date_picker(name='date_picker', label='Date picker'), ui.color_picker(name='color_picker', label='Color picker'), ui.buttons([ ui.button(name='primary_button', label='Primary', primary=True), ui.button(name='standard_button', label='Standard'), ui.button(name='standard_disabled_button', label='Standard', disabled=True), ]), ui.file_upload(name='file_upload', label='File upload'), ui.table(name='table', columns=[ ui.table_column(name='col1', label='Column 1'), ui.table_column(name='col2', label='Column 2'), ], rows=[ ui.table_row(name='row1', cells=['Text A', 'Text B']), ui.table_row(name='row2', cells=['Text C', 'Text D']), ui.table_row(name='row3', cells=['Text E', 'Text F']), ]), ui.link(label='Link'), ui.tabs(name='tabs', items=[ ui.tab(name='email', label='Mail', icon='Mail'), ui.tab(name='events', label='Events', icon='Calendar'), ui.tab(name='spam', label='Spam'), ]), ui.expander(name='expander', label='Expander'), ui.frame(path='https://example.com'), ui.markup(content=html), ui.template( content=menu, data=pack(dict(dishes=[ dict(name='Spam', price='$2.00'), dict(name='Ham', price='$3.45'), dict(name='Eggs', price='$1.75'), ])) ), ui.picker(name='picker', label='Picker', choices=[ ui.choice('choice1', label='Choice 1'), ui.choice('choice2', label='Choice 2'), ui.choice('choice3', label='Choice 3'), ]), ui.stepper(name='stepper', items=[ ui.step(label='Step 1', icon='MailLowImportance'), ui.step(label='Step 2', icon='TaskManagerMirrored'), ui.step(label='Step 3', icon='Cafe'), ]), ui.visualization( plot=ui.plot([ui.mark(type='interval', x='=product', y='=price', y_min=0)]), data=data(fields='product price', rows=[(c, x) for c, x, _ in [f.next() for _ in range(n)]], pack=True), ), ui.vega_visualization( specification=spec, data=data(fields=["a", "b"], rows=[ ["A", rnd()], ["B", rnd()], ["C", rnd()], ["D", rnd()], ["E", rnd()], ["F", rnd()], ["G", rnd()], ["H", rnd()], ["I", rnd()] ], pack=True), ), ui.button(name='show_inputs', label='Submit', primary=True), ]) await q.page.save()
async def run_app(q: Q): if q.args.start_game: if q.args.submit_game: q.client.game.is_public = True q.app.games[q.client.game.game_id] = q.client.game del q.page['leaderboard'] del q.page['hello'] await start_new_game(q) elif q.args.quit_game: del q.page['starting_game'] await make_welcome_card(q) elif q.args.guess: message = q.client.game.guess(q.args.guess) if message == 'You Got It!': q.page['starting_game'].items = [ ui.text_l( f'ЪЈЁ ЪјЅ Ъјѓ You Got It, The number is **{q.client.game.number}**' ), ui.text_m( f'You made **{len(q.client.game.guesses)}** guesses in'), ui.text_m(f'{q.client.game.game_time()}.'), ui.toggle( name='submit_game', label='Submit your game to Public Scoreboard', trigger=False, ), ui.text_xs('Рађ'), ui.buttons( items=[ ui.button( name='leaderboard', label='View Scores', primary=True, ), ui.button( name='start_game', label='Play Again', primary=False, ), ], justify='center', ), ] else: previous_guesses = [str(x) for x in q.client.game.guesses] if len(previous_guesses) > 16: previous_guesses = previous_guesses[-16:] previous_guesses[0] = '...' guesses_str = ", ".join(previous_guesses) q.page['starting_game'].items = [ ui.text_l(message), ui.text_m(guesses_str), ui.text_xs('Рађ'), ui.slider( name='guess', label='your guess', min=1, max=100, value=q.args.guess, trigger=True, ), ui.text_xs('Рађ'), ui.buttons( items=[ ui.button(name='quit_game', label='Quit', primary=True) ], justify='center', ), ] elif q.args.leaderboard: if q.args.submit_game: q.client.game.is_public = True q.app.games[q.client.game.game_id] = q.client.game del q.page['starting_game'] await show_leaderboard(q) elif q.args.private_leaderboard: await show_private_leaderboard(q) await q.page.save()
def card_sim_details() -> ui.FormCard: choices = [ 'COVID Vaccine (100mg, Moderna Injection)', 'Ibuprofen (400mg, Oral)', 'Aspirin (200mg, Tablet)', 'Syringes', 'Sutures' ] choices = [ui.choice(name=c, label=c) for c in choices] drug = ui.dropdown(name='item', choices=choices, label='Item name', value=choices[0].name) max_storage = ui.slider(name='max_storage', label='Inventory capacity', min=1, max=100, value=7) expires = ui.slider(name='expires', label='Days to expiry', min=1, max=100, value=2) mu_d = ui.slider(name='mu_d', label='Average demand per day', min=1, max=100, value=5) gpo_delay = ui.slider( name='gpo_delay', label='How long between order and delivery for GPO supplier?', min=1, max=5, value=5) gpo_cost = ui.slider(name='gpo_cost', label='GPO cost per item (in $)', min=1, max=100, value=5) alt_delay = ui.slider( name='alt_delay', label='How long between order and delivery for alternative supplier?', min=1, max=5, value=2) alt_cost = ui.slider(name='alt_cost', label='Alternative cost per item (in $)', min=1, max=100, value=9) fulfill = ui.slider(name='fulfill', label='Charge capture', min=1, max=100, value=15) punish = ui.slider(name='punish', label='Opportunity cost for failing to have inventory', min=-100, max=0, value=-50) initial = ui.slider(name='initial', label='Current inventory', min=0, max=100, value=10) buttons = ui.buttons([ ui.button(name='save', label='Save parameters', primary=True), ui.button(name='go_home', label='Back', primary=True) ]) item_list = [ drug, max_storage, initial, expires, mu_d, gpo_delay, gpo_cost, alt_delay, alt_cost, fulfill, punish, buttons ] card = ui.FormCard( box=box_sidebar, items=item_list, ) return card