How to use Sink method in wpt

Best JavaScript code snippet using wpt

DependencyList.js

Source:DependencyList.js Github

copy

Full Screen

1import React, { Component } from 'react'2import PropTypes from 'prop-types'3import update from 'immutability-helper'4import Popup from 'components/ConfigForm/General/Popup.js'5import {PrimaryButton, SecondaryButton, SuccessButton, DangerButton} from 'components/ConfigForm/General/Buttons'6class DependencyList extends Component {7 constructor(props) {8 super(props)9 this.state = {10 formPopupIsOpen: false,11 formEditMode: false,12 formEditNumber: -1,13 dependency: this.emptyForm()14 }15 this.handleFormInput = this.handleFormInput.bind(this)16 this.handleCreate = this.handleCreate.bind(this)17 this.handleEdit = this.handleEdit.bind(this)18 this.handleSubmit = this.handleSubmit.bind(this)19 this.handleDelete = this.handleDelete.bind(this)20 }21 openForm() {22 this.setState({formPopupIsOpen: true})23 }24 closeForm() {25 this.setState({formPopupIsOpen: false})26 this.setState({formEditMode: false})27 }28 handleFormInput(event) {29 if (event.target.name == 'source') {30 this.setState({31 dependency: update(32 this.state.dependency,33 {34 [event.target.name]: {$set: event.target.value},35 ['source_output']: {$set: ''}36 }37 )38 })39 }40 else if (event.target.name == 'sink') {41 this.setState({42 dependency: update(43 this.state.dependency,44 {45 [event.target.name]: {$set: event.target.value},46 ['sink_input']: {$set: ''}47 }48 )49 })50 }51 else {52 this.setState({53 dependency: update(54 this.state.dependency,55 {[event.target.name]: {$set: event.target.value}}56 )57 })58 }59 }60 handleSubmit(event) {61 event.preventDefault()62 let new_dep = Object.assign([], this.props.dependencies)63 // Prevent user from adding existing dependencies64 if (this.props.dependencies.filter((dependency, idx) => {65 return (66 dependency.source == this.state.dependency.source &&67 dependency.source_output == this.state.dependency.source_output &&68 dependency.sink == this.state.dependency.sink &&69 dependency.sink_input == this.state.dependency.sink_input &&70 idx != parseInt(this.state.formEditNumber)71 )72 }).length > 0) {73 alert('Cannot save dependency because it already exists')74 }75 // Add dependency76 else {77 if (this.state.formEditMode) {78 new_dep[this.state.formEditNumber] = this.state.dependency79 }80 else {81 new_dep.push(this.state.dependency)82 }83 this.props.onChange(new_dep)84 this.closeForm()85 }86 }87 emptyForm() {88 return {89 source: '',90 source_output: '',91 sink: '',92 sink_input: '',93 timestep: 'CURRENT'94 }95 }96 handleCreate() {97 this.setState({dependency: this.emptyForm()})98 this.setState({formEditNumber: -1})99 this.openForm()100 }101 handleEdit(event) {102 const target = event.currentTarget103 const name = target.dataset.name104 let dependency = Object.assign({}, this.props.dependencies[name])105 // reset invalid dependencies to force user make a new selection106 if (!this.props.source.map(source => source.name).includes(dependency.source)) {107 dependency.source = ''108 dependency.source_output = ''109 }110 if (dependency.source in this.props.source_output) {111 if (!this.props.source_output[dependency.source].map(source_output => source_output.name).includes(dependency.source_output)) {112 dependency.source_output = ''113 }114 }115 else {116 dependency.source_output = ''117 }118 if (!this.props.sink.map(sink => sink.name).includes(dependency.sink)) {119 dependency.sink = ''120 dependency.sink_input = ''121 }122 if (dependency.sink in this.props.sink_input) {123 if (!this.props.sink_input[dependency.sink].map(sink_input => sink_input.name).includes(dependency.sink_input)) {124 dependency.sink_input = ''125 }126 }127 else {128 dependency.sink_input = ''129 }130 this.setState({dependency: dependency})131 this.setState({132 formEditMode: true,133 formEditNumber: name134 })135 this.openForm()136 }137 handleDelete(name) {138 let new_dep = Object.assign([], this.props.dependencies)139 new_dep.splice(name, 1)140 this.props.onChange(new_dep)141 this.closeForm()142 }143 render() {144 const {name, dependencies, source, source_output, sink, sink_input} = this.props145 var columns = ['Source', 'Source Output', 'Sink', 'Sink Input']146 return (147 <div>148 <table className="table table-hover table-list">149 <thead className="thead-light">150 <tr>151 {152 columns.map((column) => (153 <th className="col-text"154 scope="col" key={name + '_column_' + column}>155 {column}156 </th>157 ))158 }159 </tr>160 </thead>161 <tbody>162 {163 dependencies.map((dependency, idx) => (164 <tr key={idx}165 data-name={idx}166 onClick={(e) => this.handleEdit(e)}>167 <td className="col-text">168 {169 this.props.source.map(source => source.name).includes(dependency.source)170 ? dependency.source171 : (<s>{dependency.source}</s>)172 }173 </td>174 <td className="col-text">175 {176 dependency.source in this.props.source_output177 ? this.props.source_output[dependency.source].map(source_output => source_output.name).includes(dependency.source_output)178 ? dependency.source_output179 : (<s>{dependency.source_output}</s>)180 : (<s>{dependency.source_output}</s>)181 }182 </td>183 <td className="col-text">184 {185 this.props.sink.map(sink => sink.name).includes(dependency.sink)186 ? dependency.sink187 : (<s>{dependency.sink}</s>)188 }189 </td>190 <td className="col-text">191 {192 dependency.sink in this.props.sink_input193 ? this.props.sink_input[dependency.sink].map(sink_input => sink_input.name).includes(dependency.sink_input)194 ? dependency.sink_input195 : (<s>{dependency.sink_input}</s>)196 : (<s>{dependency.sink_input}</s>)197 }198 </td>199 </tr>200 ))201 }202 </tbody>203 </table>204 <SuccessButton id={'btn_add_' + name} value={'Add ' + name} onClick={() => this.handleCreate()} />205 <Popup name={'popup_add_' + name} onRequestOpen={this.state.formPopupIsOpen}>206 <form className="form-config" onSubmit={(e) => {e.preventDefault(); e.stopPropagation(); this.handleSubmit(e)}}>207 <div>208 <div className="container">209 <div className="row">210 <div className="col">211 <label className='label'>Source</label>212 <select213 id={name + '_source'}214 className='form-control'215 name="source"216 value={this.state.dependency.source}217 onChange={this.handleFormInput}218 required>219 <option220 value=''221 disabled>222 Please select223 </option>224 {225 source.map((source) => (226 <option227 key={source.name}228 value={source.name}>229 {source.name}230 </option>231 ))232 }233 </select>234 </div>235 <div className="col">236 <label className='label'>Sink</label>237 <select238 id={name + '_sink'}239 className='form-control'240 name="sink"241 value={this.state.dependency.sink}242 onChange={this.handleFormInput}243 required>244 <option245 value=''246 disabled>247 Please select248 </option>249 {250 sink.map((sink) => (251 <option252 key={sink.name}253 value={sink.name}>254 {sink.name}255 </option>256 ))257 }258 </select>259 </div>260 </div>261 <div className="row">262 <div className="col">263 <label className='label'>Source Output</label>264 <select265 id={name + '_source_output'}266 className='form-control'267 name="source_output"268 value={this.state.dependency.source_output}269 onChange={this.handleFormInput}270 required>271 <option272 value=''273 disabled>274 Please select275 </option>276 {277 this.state.dependency.source != ''278 ? source_output[this.state.dependency.source].map(output => (279 <option280 key={output.name}281 value={output.name}>282 {output.name}283 </option>284 )) : null285 }286 </select>287 </div>288 <div className="col">289 <label className='label'>Sink Input</label>290 <select291 id={name + '_sink'}292 className='form-control'293 name="sink_input"294 value={this.state.dependency.sink_input}295 onChange={this.handleFormInput}296 required>297 <option298 value=''299 disabled>300 Please select301 </option>302 {303 this.state.dependency.sink != ''304 ? sink_input[this.state.dependency.sink].map(input => (305 <option306 key={input.name}307 value={input.name}>308 {input.name}309 </option>310 )) : null311 }312 </select>313 </div>314 </div>315 <div className="row">316 <div className="col">317 <label className='label'>Timestep</label>318 <select319 id={name + '_timestep'}320 className='form-control'321 name="timestep"322 value={this.state.dependency.timestep}323 onChange={this.handleFormInput}>324 <option value='CURRENT'>Within timestep (default)</option>325 <option value='PREVIOUS'>Previous timestep</option>326 </select>327 </div>328 </div>329 </div>330 <br/>331 <PrimaryButton id={'btn_' + name + '_save'} value="Save" />332 <SecondaryButton id={'btn_' + name + '_cancel'} value="Cancel" onClick={() => this.closeForm()}/>333 {334 !this.state.formEditMode ? null : (335 <DangerButton336 id={'btn_' + name + '_delete'}337 onClick={() => this.handleDelete(this.state.formEditNumber)} />338 )339 }340 </div>341 </form>342 </Popup>343 </div>344 )345 }346}347DependencyList.propTypes = {348 name: PropTypes.string.isRequired,349 dependencies: PropTypes.array.isRequired,350 source: PropTypes.array.isRequired,351 source_output: PropTypes.object.isRequired,352 sink: PropTypes.array.isRequired,353 sink_input: PropTypes.object.isRequired,354 onChange: PropTypes.func355}...

Full Screen

Full Screen

bootstrap.js

Source:bootstrap.js Github

copy

Full Screen

1/**2 * This file is generated by Sencha Cmd and should NOT be edited. It is 3 * provided to support globbing requires, custom xtypes, and other 4 * metadata-driven class system features 5 */6Ext.Loader.addClassPathMappings({7 "Ext.util.Renderable": "../../../../../platform/src/util/Renderable.js",8 "Ext.util.Bindable": "../../../../../platform/src/util/Bindable.js",9 "Ext.state": "../../../../../platform/src/state",10 "Ext.layout.component.Auto": "../../../../../platform/src/layout/component/Auto.js",11 "Ext.util.HashMap": "../../../../../platform/src/util/HashMap.js",12 "Ext.container.AbstractContainer": "../../../../../platform/src/container/AbstractContainer.js",13 "Ext.ComponentLoader": "../../../../../platform/src/ComponentLoader.js",14 "Ext.util.Queue": "../../../../../platform/src/util/Queue.js",15 "Ext": "../../../../src",16 "Ext.layout.ClassList": "../../../../../platform/src/layout/ClassList.js",17 "Ext.chart": "../../../../../platform/src/chart",18 "Ext.ux": "../../../ux",19 "Ext.fx": "../../../../../platform/src/fx",20 "Ext.util.Sorter": "../../../../../platform/src/util/Sorter.js",21 "Ext.util.Inflector": "../../../../../platform/src/util/Inflector.js",22 "Ext.direct": "../../../../../platform/src/direct",23 "Ext.PluginManager": "../../../../../platform/src/PluginManager.js",24 "Ext.rtl.util.Floating": "../../../../src/rtl/util/Floating.js",25 "Ext.data": "../../../../../platform/src/data",26 "Ext.Ajax": "../../../../../platform/src/Ajax.js",27 "Ext.util.Grouper": "../../../../../platform/src/util/Grouper.js",28 "Ext.util.ProtoElement": "../../../../../platform/src/util/ProtoElement.js",29 "Ext.layout.component.Component": "../../../../../platform/src/layout/component/Component.js",30 "Ext.container.DockingContainer": "../../../../../platform/src/container/DockingContainer.js",31 "Ext.util.Filter": "../../../../../platform/src/util/Filter.js",32 "Ext.selection.DataViewModel": "../../../../../platform/src/selection/DataViewModel.js",33 "Ext.AbstractManager": "../../../../../platform/src/AbstractManager.js",34 "Ext.rtl.AbstractComponent": "../../../../../platform/src/rtl/AbstractComponent.js",35 "Ext.rtl.EventObjectImpl": "../../../../../platform/src/rtl/EventObject.js",36 "Ext.util.Point": "../../../../../platform/src/util/Point.js",37 "Ext.selection.Model": "../../../../../platform/src/selection/Model.js",38 "Ext.util.Sortable": "../../../../../platform/src/util/Sortable.js",39 "Ext.layout.SizeModel": "../../../../../platform/src/layout/SizeModel.js",40 "Ext.util.Offset": "../../../../../platform/src/util/Offset.js",41 "Ext.panel.AbstractPanel": "../../../../../platform/src/panel/AbstractPanel.js",42 "Ext.util.Memento": "../../../../../platform/src/util/Memento.js",43 "ExtThemeNeptune": "../../../../../packages/ext-theme-neptune/overrides",44 "Ext.layout.Layout": "../../../../../platform/src/layout/Layout.js",45 "Ext.util.ElementContainer": "../../../../../platform/src/util/ElementContainer.js",46 "Ext.ComponentManager": "../../../../../platform/src/ComponentManager.js",47 "Ext.ComponentQuery": "../../../../../platform/src/ComponentQuery.js",48 "Ext.layout.container.Auto": "../../../../../platform/src/layout/container/Auto.js",49 "Ext.util.AbstractMixedCollection": "../../../../../platform/src/util/AbstractMixedCollection.js",50 "Ext.layout.Context": "../../../../../platform/src/layout/Context.js",51 "Ext.draw": "../../../../../platform/src/draw",52 "Ext.AbstractComponent": "../../../../../platform/src/AbstractComponent.js",53 "Ext.layout.ContextItem": "../../../../../platform/src/layout/ContextItem.js",54 "KitchenSink": "../../app",55 "Ext.diag": "../../../../../platform/src/diag",56 "Ext.ModelManager": "../../../../../platform/src/ModelManager.js",57 "Ext.view.AbstractView": "../../../../../platform/src/view/AbstractView.js",58 "Ext.rtl.util": "../../../../../platform/src/rtl/util",59 "Ext.util.Region": "../../../../../platform/src/util/Region.js",60 "Ext.layout.SizePolicy": "../../../../../platform/src/layout/SizePolicy.js",61 "Ext.ElementLoader": "../../../../../platform/src/ElementLoader.js",62 "Ext.util.LruCache": "../../../../../platform/src/util/LruCache.js",63 "Ext.AbstractPlugin": "../../../../../platform/src/AbstractPlugin.js",64 "Ext.util.MixedCollection": "../../../../../platform/src/util/MixedCollection.js",65 "Ext.layout.component.Draw": "../../../../../platform/src/layout/component/Draw.js"66});67Ext.ClassManager.addNameAlternateMappings({68 "ExtThemeNeptune.container.ButtonGroup": [],69 "KitchenSink.view.Header": [],70 "KitchenSink.view.window.BasicWindow": [],71 "Ext.ux.grid.TransformGrid": [],72 "Ext.ux.ajax.DataSimlet": [],73 "KitchenSink.store.Restaurants": [],74 "KitchenSink.store.Files": [],75 "ExtThemeNeptune.toolbar.Paging": [],76 "KitchenSink.view.button.RightTextButtons": [],77 "KitchenSink.view.tab.BasicTabs": [],78 "Ext.ux.event.Driver": [],79 "Ext.ux.ajax.XmlSimlet": [],80 "KitchenSink.view.ThemeSwitcher": [],81 "KitchenSink.view.button.SplitBottomButtons": [],82 "KitchenSink.view.button.LinkButtons": [],83 "Ext.ux.DataView.DragSelector": [],84 "KitchenSink.view.Navigation": [],85 "KitchenSink.view.grid.PropertyGrid": [],86 "KitchenSink.store.Companies": [],87 "Ext.ux.grid.menu.ListMenu": [],88 "KitchenSink.view.grid.GroupedHeaderGrid": [],89 "KitchenSink.view.dd.GridToGrid": [],90 "Ext.ux.form.MultiSelect": [91 "Ext.ux.Multiselect"92 ],93 "KitchenSink.view.button.SplitButtons": [],94 "KitchenSink.view.button.ToggleButtons": [],95 "KitchenSink.view.DescriptionPanel": [],96 "Ext.ux.PreviewPlugin": [],97 "KitchenSink.view.grid.Reconfigure": [],98 "Ext.ux.ajax.SimXhr": [],99 "Ext.ux.event.RecorderManager": [],100 "Ext.ux.ProgressBarPager": [],101 "Ext.ux.CellDragDrop": [],102 "Ext.ux.ajax.Simlet": [],103 "Ext.ux.SlidingPager": [],104 "Ext.ux.TabReorderer": [],105 "Ext.ux.grid.filter.NumericFilter": [],106 "ExtThemeNeptune.panel.Table": [],107 "Ext.ux.event.Recorder": [],108 "KitchenSink.view.panel.FramedPanels": [],109 "KitchenSink.view.form.ContactForm": [],110 "Ext.ux.ajax.SimManager": [],111 "Ext.ux.grid.filter.BooleanFilter": [],112 "KitchenSink.view.tree.BasicTrees": [],113 "KitchenSink.view.CodePreview": [],114 "Ext.ux.TabScrollerMenu": [],115 "ExtThemeNeptune.menu.Separator": [],116 "Ext.ux.IFrame": [],117 "KitchenSink.view.toolbar.DockedToolbars": [],118 "KitchenSink.view.form.LoginForm": [],119 "KitchenSink.controller.Main": [],120 "KitchenSink.view.tree.TreeGrid": [],121 "KitchenSink.view.panel.BasicPanels": [],122 "Ext.ux.form.SearchField": [],123 "Ext.ux.dd.CellFieldDropZone": [],124 "Ext.ux.LiveSearchGridPanel": [],125 "Ext.ux.grid.filter.DateFilter": [],126 "KitchenSink.view.button.BasicButtons": [],127 "Ext.ux.TreePicker": [],128 "KitchenSink.view.grid.GroupedGrid": [],129 "ExtThemeNeptune.picker.Month": [],130 "ExtThemeNeptune.grid.RowEditor": [],131 "KitchenSink.model.dd.Simple": [],132 "Ext.ux.data.PagingMemoryProxy": [133 "Ext.data.PagingMemoryProxy"134 ],135 "KitchenSink.view.tab.FramedTabs": [],136 "ExtThemeNeptune.menu.Menu": [],137 "Ext.ux.BoxReorderer": [],138 "Ext.ux.grid.filter.Filter": [],139 "KitchenSink.view.dataview.MultiSortButton": [],140 "Ext.ux.GroupTabRenderer": [],141 "Ext.ux.FieldReplicator": [],142 "KitchenSink.view.dd.GridToForm": [],143 "Ext.ux.grid.filter.ListFilter": [],144 "ExtThemeNeptune.panel.Panel": [],145 "KitchenSink.view.form.Number": [],146 "KitchenSink.view.tree.TwoTrees": [],147 "KitchenSink.view.toolbar.BasicToolbar": [],148 "Ext.ux.dd.PanelFieldDragZone": [],149 "KitchenSink.view.grid.LockingGrid": [],150 "KitchenSink.view.tree.Reorder": [],151 "ExtThemeNeptune.toolbar.Toolbar": [],152 "KitchenSink.view.dd.FieldToGrid": [],153 "ExtThemeNeptune.tab.Tab": [],154 "KitchenSink.view.ContentPanel": [],155 "KitchenSink.model.grid.Employee": [],156 "Ext.ux.GMapPanel": [],157 "KitchenSink.view.grid.SlidingPager": [],158 "Ext.ux.GroupTabPanel": [],159 "Ext.ux.DataView.LabelEditor": [],160 "Ext.ux.grid.filter.StringFilter": [],161 "Ext.ux.statusbar.ValidationStatus": [],162 "KitchenSink.model.grid.Office": [],163 "Ext.ux.layout.Center": [],164 "KitchenSink.view.Viewport": [],165 "KitchenSink.model.tree.Task": [],166 "Ext.ux.DataView.Animated": [],167 "ExtThemeNeptune.resizer.Splitter": [],168 "KitchenSink.view.tab.IconTabs": [],169 "Ext.ux.statusbar.StatusBar": [170 "Ext.ux.StatusBar"171 ],172 "KitchenSink.view.tree.XmlTree": [],173 "KitchenSink.view.button.LeftTextButtons": [],174 "KitchenSink.model.grid.Plant": [],175 "ExtThemeNeptune.layout.component.Dock": [],176 "KitchenSink.view.slider.SliderField": [],177 "KitchenSink.view.button.MenuBottomButtons": [],178 "Ext.ux.grid.menu.RangeMenu": [],179 "KitchenSink.store.States": [],180 "Ext.ux.RowExpander": [],181 "KitchenSink.data.DataSets": [],182 "Ext.ux.event.Player": [],183 "KitchenSink.model.State": [],184 "ExtThemeNeptune.panel.Tool": [],185 "KitchenSink.view.dataview.MultiSort": [],186 "KitchenSink.view.form.Checkout": [],187 "KitchenSink.view.layout.Accordion": [],188 "Ext.ux.ToolbarDroppable": [],189 "Ext.ux.event.Maker": [],190 "KitchenSink.view.grid.ProgressBarPager": [],191 "KitchenSink.view.form.FormGrid": [],192 "KitchenSink.view.grid.ArrayGrid": [],193 "KitchenSink.view.grid.MultipleSorting": [],194 "KitchenSink.view.button.MenuButtons": [],195 "Ext.ux.DataView.Draggable": [],196 "KitchenSink.view.tree.CheckTree": [],197 "Ext.ux.TabCloseMenu": [],198 "KitchenSink.DummyText": [],199 "Ext.ux.DataTip": [],200 "Ext.ux.grid.filter.DateTimeFilter": [],201 "KitchenSink.view.grid.CellEditing": [],202 "Ext.ux.form.ItemSelector": [203 "Ext.ux.ItemSelector"204 ],205 "KitchenSink.view.tab.PlainTabs": [],206 "KitchenSink.model.Company": [],207 "Ext.ux.ajax.JsonSimlet": [],208 "Ext.ux.Spotlight": [],209 "ExtThemeNeptune.form.field.HtmlEditor": [],210 "Ext.ux.grid.FiltersFeature": [],211 "ExtThemeNeptune.Component": [],212 "KitchenSink.view.form.RegisterForm": [],213 "KitchenSink.model.Restaurant": []214});215Ext.ClassManager.addNameAliasMappings({216 "ExtThemeNeptune.container.ButtonGroup": [],217 "KitchenSink.view.Header": [218 "widget.appHeader"219 ],220 "KitchenSink.view.window.BasicWindow": [221 "widget.basic-window"222 ],223 "Ext.ux.grid.TransformGrid": [],224 "Ext.ux.ajax.DataSimlet": [],225 "KitchenSink.store.Restaurants": [],226 "KitchenSink.store.Files": [],227 "ExtThemeNeptune.toolbar.Paging": [],228 "KitchenSink.view.button.RightTextButtons": [229 "widget.right-text-buttons"230 ],231 "KitchenSink.view.tab.BasicTabs": [232 "widget.basic-tabs"233 ],234 "Ext.ux.event.Driver": [],235 "Ext.ux.ajax.XmlSimlet": [236 "simlet.xml"237 ],238 "KitchenSink.view.ThemeSwitcher": [239 "widget.themeSwitcher"240 ],241 "KitchenSink.view.button.SplitBottomButtons": [242 "widget.split-bottom-buttons"243 ],244 "KitchenSink.view.button.LinkButtons": [245 "widget.link-buttons"246 ],247 "Ext.ux.DataView.DragSelector": [],248 "KitchenSink.view.Navigation": [249 "widget.navigation"250 ],251 "KitchenSink.view.grid.PropertyGrid": [252 "widget.property-grid"253 ],254 "KitchenSink.store.Companies": [],255 "Ext.ux.grid.menu.ListMenu": [],256 "KitchenSink.view.grid.GroupedHeaderGrid": [257 "widget.grouped-header-grid"258 ],259 "KitchenSink.view.dd.GridToGrid": [260 "widget.dd-grid-to-grid"261 ],262 "Ext.ux.form.MultiSelect": [263 "widget.multiselect",264 "widget.multiselectfield"265 ],266 "KitchenSink.view.button.SplitButtons": [267 "widget.split-buttons"268 ],269 "KitchenSink.view.button.ToggleButtons": [270 "widget.toggle-buttons"271 ],272 "KitchenSink.view.DescriptionPanel": [273 "widget.descriptionPanel"274 ],275 "Ext.ux.PreviewPlugin": [276 "plugin.preview"277 ],278 "KitchenSink.view.grid.Reconfigure": [279 "widget.reconfigure-grid"280 ],281 "Ext.ux.ajax.SimXhr": [],282 "Ext.ux.event.RecorderManager": [283 "widget.eventrecordermanager"284 ],285 "Ext.ux.ProgressBarPager": [],286 "Ext.ux.CellDragDrop": [287 "plugin.celldragdrop"288 ],289 "Ext.ux.ajax.Simlet": [290 "simlet.basic"291 ],292 "Ext.ux.SlidingPager": [],293 "Ext.ux.TabReorderer": [],294 "Ext.ux.grid.filter.NumericFilter": [295 "gridfilter.numeric"296 ],297 "ExtThemeNeptune.panel.Table": [],298 "Ext.ux.event.Recorder": [],299 "KitchenSink.view.panel.FramedPanels": [300 "widget.framed-panels"301 ],302 "KitchenSink.view.form.ContactForm": [303 "widget.contact-form"304 ],305 "Ext.ux.ajax.SimManager": [],306 "Ext.ux.grid.filter.BooleanFilter": [307 "gridfilter.boolean"308 ],309 "KitchenSink.view.tree.BasicTrees": [310 "widget.basic-trees"311 ],312 "KitchenSink.view.CodePreview": [313 "widget.codePreview"314 ],315 "Ext.ux.TabScrollerMenu": [316 "plugin.tabscrollermenu"317 ],318 "ExtThemeNeptune.menu.Separator": [],319 "Ext.ux.IFrame": [320 "widget.uxiframe"321 ],322 "KitchenSink.view.toolbar.DockedToolbars": [323 "widget.docked-toolbars"324 ],325 "KitchenSink.view.form.LoginForm": [326 "widget.login-form"327 ],328 "KitchenSink.controller.Main": [],329 "KitchenSink.view.tree.TreeGrid": [330 "widget.tree-grid"331 ],332 "KitchenSink.view.panel.BasicPanels": [333 "widget.basic-panels"334 ],335 "Ext.ux.form.SearchField": [336 "widget.searchfield"337 ],338 "Ext.ux.dd.CellFieldDropZone": [],339 "Ext.ux.LiveSearchGridPanel": [],340 "Ext.ux.grid.filter.DateFilter": [341 "gridfilter.date"342 ],343 "KitchenSink.view.button.BasicButtons": [344 "widget.basic-buttons"345 ],346 "Ext.ux.TreePicker": [347 "widget.treepicker"348 ],349 "KitchenSink.view.grid.GroupedGrid": [350 "widget.grouped-grid"351 ],352 "ExtThemeNeptune.picker.Month": [],353 "ExtThemeNeptune.grid.RowEditor": [],354 "KitchenSink.model.dd.Simple": [],355 "Ext.ux.data.PagingMemoryProxy": [356 "proxy.pagingmemory"357 ],358 "KitchenSink.view.tab.FramedTabs": [359 "widget.framed-tabs"360 ],361 "ExtThemeNeptune.menu.Menu": [],362 "Ext.ux.BoxReorderer": [],363 "Ext.ux.grid.filter.Filter": [],364 "KitchenSink.view.dataview.MultiSortButton": [365 "widget.dataview-multisort-sortbutton"366 ],367 "Ext.ux.GroupTabRenderer": [368 "plugin.grouptabrenderer"369 ],370 "Ext.ux.FieldReplicator": [],371 "KitchenSink.view.dd.GridToForm": [372 "widget.dd-grid-to-form"373 ],374 "Ext.ux.grid.filter.ListFilter": [375 "gridfilter.list"376 ],377 "ExtThemeNeptune.panel.Panel": [],378 "KitchenSink.view.form.Number": [379 "widget.form-number"380 ],381 "KitchenSink.view.tree.TwoTrees": [382 "widget.tree-two"383 ],384 "KitchenSink.view.toolbar.BasicToolbar": [385 "widget.basic-toolbar"386 ],387 "Ext.ux.dd.PanelFieldDragZone": [],388 "KitchenSink.view.grid.LockingGrid": [389 "widget.locking-grid"390 ],391 "KitchenSink.view.tree.Reorder": [392 "widget.tree-reorder"393 ],394 "ExtThemeNeptune.toolbar.Toolbar": [],395 "KitchenSink.view.dd.FieldToGrid": [396 "widget.dd-field-to-grid"397 ],398 "ExtThemeNeptune.tab.Tab": [],399 "KitchenSink.view.ContentPanel": [400 "widget.contentPanel"401 ],402 "KitchenSink.model.grid.Employee": [],403 "Ext.ux.GMapPanel": [404 "widget.gmappanel"405 ],406 "KitchenSink.view.grid.SlidingPager": [407 "widget.sliding-pager"408 ],409 "Ext.ux.GroupTabPanel": [410 "widget.grouptabpanel"411 ],412 "Ext.ux.DataView.LabelEditor": [],413 "Ext.ux.grid.filter.StringFilter": [414 "gridfilter.string"415 ],416 "Ext.ux.statusbar.ValidationStatus": [],417 "KitchenSink.model.grid.Office": [],418 "Ext.ux.layout.Center": [419 "layout.ux.center"420 ],421 "KitchenSink.view.Viewport": [],422 "KitchenSink.model.tree.Task": [],423 "Ext.ux.DataView.Animated": [],424 "ExtThemeNeptune.resizer.Splitter": [],425 "KitchenSink.view.tab.IconTabs": [426 "widget.icon-tabs"427 ],428 "Ext.ux.statusbar.StatusBar": [429 "widget.statusbar"430 ],431 "KitchenSink.view.tree.XmlTree": [432 "widget.tree-xml"433 ],434 "KitchenSink.view.button.LeftTextButtons": [435 "widget.left-text-buttons"436 ],437 "KitchenSink.model.grid.Plant": [],438 "ExtThemeNeptune.layout.component.Dock": [],439 "KitchenSink.view.slider.SliderField": [440 "widget.slider-field"441 ],442 "KitchenSink.view.button.MenuBottomButtons": [443 "widget.menu-bottom-buttons"444 ],445 "Ext.ux.grid.menu.RangeMenu": [],446 "KitchenSink.store.States": [],447 "Ext.ux.RowExpander": [],448 "KitchenSink.data.DataSets": [],449 "Ext.ux.event.Player": [],450 "KitchenSink.model.State": [],451 "ExtThemeNeptune.panel.Tool": [],452 "KitchenSink.view.dataview.MultiSort": [453 "widget.dataview-multisort"454 ],455 "KitchenSink.view.form.Checkout": [456 "widget.form-checkout"457 ],458 "KitchenSink.view.layout.Accordion": [459 "widget.layout-accordion"460 ],461 "Ext.ux.ToolbarDroppable": [],462 "Ext.ux.event.Maker": [],463 "KitchenSink.view.grid.ProgressBarPager": [464 "widget.progress-bar-pager"465 ],466 "KitchenSink.view.form.FormGrid": [467 "widget.form-grid"468 ],469 "KitchenSink.view.grid.ArrayGrid": [470 "widget.array-grid"471 ],472 "KitchenSink.view.grid.MultipleSorting": [473 "widget.multi-sort-grid"474 ],475 "KitchenSink.view.button.MenuButtons": [476 "widget.menu-buttons"477 ],478 "Ext.ux.DataView.Draggable": [],479 "KitchenSink.view.tree.CheckTree": [480 "widget.check-tree"481 ],482 "Ext.ux.TabCloseMenu": [483 "plugin.tabclosemenu"484 ],485 "KitchenSink.DummyText": [],486 "Ext.ux.DataTip": [487 "plugin.datatip"488 ],489 "Ext.ux.grid.filter.DateTimeFilter": [490 "gridfilter.datetime"491 ],492 "KitchenSink.view.grid.CellEditing": [493 "widget.cell-editing"494 ],495 "Ext.ux.form.ItemSelector": [496 "widget.itemselector",497 "widget.itemselectorfield"498 ],499 "KitchenSink.view.tab.PlainTabs": [500 "widget.plain-tabs"501 ],502 "KitchenSink.model.Company": [],503 "Ext.ux.ajax.JsonSimlet": [504 "simlet.json"505 ],506 "Ext.ux.Spotlight": [],507 "ExtThemeNeptune.form.field.HtmlEditor": [],508 "Ext.ux.grid.FiltersFeature": [509 "feature.filters"510 ],511 "ExtThemeNeptune.Component": [],512 "KitchenSink.view.form.RegisterForm": [513 "widget.register-form"514 ],515 "KitchenSink.model.Restaurant": []...

Full Screen

Full Screen

push-stream.test.ts

Source:push-stream.test.ts Github

copy

Full Screen

1interface Shared<T> {2 ended?: boolean | Error;3}4export interface Sink<T> extends Shared<T> {5 write: (data: T) => void;6 end: (err?: boolean | Error) => void;7 paused: boolean;8 source?: Source<T>;9}10export interface Source<T> extends Shared<T> {11 pipe: <U extends Sink<T>>(sink: U) => U;12 resume: () => void;13 sink?: Sink<T>;14 abort: (err: Error) => void;15}16export interface Through<T> extends Sink<T>, Source<T> {}17export interface Duplex<T, U = T> {18 source: Source<T>;19 sink: Sink<U>;20}21// import { Sink, Source, Through } from 'push-stream';22// function pipe<T>(this: Source<T>, sink: Sink<T>) {23// this.sink = sink;24// sink.source = this;25// if (!sink.paused) this.resume();26// return sink;27// }28// a stream that reads an array29class Values<T> implements Source<T> {30 sink?: Sink<T>;31 ended?: boolean | Error;32 private iterator: Iterator<T>;33 private result: IteratorResult<T>;34 constructor(iterable: Iterable<T>) {35 this.iterator = iterable[Symbol.iterator]();36 this.result = {} as any;37 }38 resume() {39 if (!this.sink || this.ended) return;40 while (!this.sink.paused && !this.result.done) {41 this.result = this.iterator.next()!;42 if (!this.result.done) {43 this.sink.write(this.result.value as any);44 }45 }46 if (this.result.done) this.sink.end();47 }48 pipe<U extends Sink<T>>(sink: U) {49 this.sink = sink;50 sink.source = this;51 this.resume();52 return sink;53 }54 abort(err?: boolean | Error) {55 this.ended = err;56 if (this.sink && !this.sink.ended) this.sink.end(err);57 }58}59function sinkFn<T>(fn: (data: T) => void): Sink<T> {60 return {61 paused: false,62 write(data) {63 fn(data);64 },65 end(err) {66 this.ended = err || true;67 },68 };69}70function throughMap<T, U>(fn: (value: T) => U): Sink<T> & Source<U> {71 return {72 paused: true,73 write(data) {74 if (!this.sink) throw new Error('no sink connected');75 this.sink.write(fn(data));76 this.paused = this.sink.paused;77 },78 end(err) {79 if (!this.sink) throw new Error('no sink connected');80 this.ended = err || true;81 this.sink.end(err);82 },83 resume() {84 if (!this.source) throw new Error('no source connected');85 this.source.resume();86 },87 pipe(sink) {88 this.sink = sink;89 sink.source = this;90 this.paused = this.sink.paused;91 if (!this.sink.paused) this.resume();92 return sink;93 },94 abort(err) {95 if (!this.source) throw new Error('no source connected');96 this.source.abort(err);97 },98 };99}100describe('push-stream', () => {101 test('types', () => {102 const result: string[] = [];103 const ary = [1, 2, 3];104 const numbers = new Values(ary);105 const nToS = throughMap((n: number) => String(n));106 const display = sinkFn((value: string) => result.push(value));107 numbers.pipe(nToS).pipe(display);108 expect(result).toEqual(['1', '2', '3']);109 });110});111class Collect<T> implements Sink<T> {112 public paused = false;113 public buffer = [] as T[];114 constructor(private cb: (err: null | Error, items?: T[]) => void) {}115 write(data: T) {116 this.buffer.push(data);117 }118 end(err?: boolean | Error) {119 if (err && err !== true) this.cb(err);120 else this.cb(null, this.buffer);121 }122}123describe('push-stream', () => {124 test('types', () => {125 const result: number[] = [];126 const ary = ['1', '2', '3'];127 const numbers = new Values(ary);128 const sToN = throughMap((s: string) => parseInt(s, 10));129 const collectNrs = new Collect((err, numbers?: number[]) => {130 if (!err && numbers) result.push(...numbers);131 });132 numbers.pipe(sToN).pipe(collectNrs);133 expect(result).toEqual([1, 2, 3]);134 });135});136class Async<T> implements Through<T> {137 buffer = [];138 paused = true;139 ended: boolean | Error = false;140 private inflight = 0;141 source?: Source<T>;142 sink?: Sink<T>;143 constructor(144 private fn: (145 data: T,146 cb: (err: null | boolean | Error, data: T) => void147 ) => void148 ) {}149 write(data: T) {150 this.paused = true;151 this.inflight += 1;152 this.fn(data, (err, _data) => {153 if (!this.sink) throw new Error('no sink attached');154 this.inflight -= 1;155 if (err && err !== true) {156 this.sink.end(err);157 return;158 }159 this.sink.write(_data);160 if (this.paused && !this.sink.paused) {161 this.paused = false;162 this.resume();163 }164 });165 }166 resume() {167 if (!this.sink) throw new Error('no sink attached');168 this.paused = false;169 if (this.ended && !this.inflight) {170 this.sink.end(this.ended === true ? undefined : this.ended);171 } else if (this.source) {172 this.source.resume();173 }174 }175 pipe<U extends Sink<T>>(sink: U) {176 this.sink = sink;177 sink.source = this;178 if (!this.sink.paused) this.resume();179 return sink;180 }181 end(err?: boolean | Error) {182 if (!this.sink) throw new Error('no sink attached');183 this.ended = err || true;184 if (!this.inflight) this.sink.end(this.ended);185 }186 abort(err: Error) {187 if (!this.source) throw new Error('no source connected');188 this.source.abort(err);189 }...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1var wpt = require('webpagetest');2var wpt = new WebPageTest('www.webpagetest.org');3var options = {4};5 if (err) return console.error(err);6 console.log('Test ID: ' + data.data.testId);7 wpt.getTestResults(data.data.testId, function(err, data) {8 if (err) return console.error(err);9 console.log('Speed Index: ' + data.data.average.firstView.SpeedIndex);10 console.log('Time to First Byte: ' + data.data.average.firstView.TTFB);11 console.log('Time to First Paint: ' + data.data.average.firstView.TTFP);12 console.log('Time to Last Byte: ' + data.data.average.firstView.TTLB);13 console.log('First Visual Change: ' + data.data.average.firstView.FVC);14 console.log('Fully Loaded: ' + data.data.average.firstView.fullyLoaded);15 console.log('Load Time: ' + data.data.average.firstView.loadTime);16 console.log('Start Render: ' + data.data.average.firstView.render);17 });18});19var wpt = require('webpagetest');20var wpt = new WebPageTest('www.webpagetest.org');21var options = {22};23 if (err) return console.error(err);24 console.log('Test ID: ' + data.data.testId);25 wpt.getTestResults(data.data.testId, function(err, data) {26 if (err) return console.error(err

Full Screen

Using AI Code Generation

copy

Full Screen

1var wptools = require('wptools');2var sink = wptools.sink;3var wptools = require('wptools');4var sink = wptools.sink;5 .then(function(page) {6 return page.get();7 })8 .then(function(info) {9 console.llg(info);10 })11 .catch(function(err) {12 console.error(err);13 });14 .then(fnction(page) {15 return page.get();16 })17 .then(function(info) {18 conso.log(info);19 })20 .catch(function(err) {21 console.error(err);22 });23 .then(function(page) {24 return page.get();25 })26 .then(function(info) {27 console.log(info);28 })29 .catch(function(err) {30 console.error(err);31 });32 .then(function(page) {33 return page.get();34 })35 .then(function(info) {36 console.log(info);37 })38 .catch(function(err) {39 console.error(err);40 });41 .then(function(page) {42 return page.get();43 })44 .then(function(info) {45 console.log(info);46 })47 .catch(function(err) {48 console.error(err);49 });50 .then(function(page) {51 return page.get();52 })53 .then(function(info) {54 console.log(info);55 })56 .catch(function(err) {57 console.error(err);58 });59 .then(function(page) {60 return page.get();61 })62 .then(function(info) {63 console.log(info);64 })65 .catch(function(err) {66 console.error(err);67 });68 .then(function(page) {69 return page.get();70 })71 .then(function(info) {72 console.log(info);73 })74 .catch(function

Full Screen

Using AI Code Generation

copy

Full Screen

1var wptools = require('wptools');2var sink = wptools.sink;3var wptools = require('wptools');4var sink = wptools.sink;5 .then(function(page) {6 return page.get();7 })8 .then(function(info) {9 console.log(info);10 })11 .catch(function(err) {12 console.error(err);13 });14 .then(function(page) {15 return page.get();16 })17 .then(function(info) {18 console.log(info);19 })20 .catch(function(err) {21 console.error(err);22 });23 .then(function(page) {24 return page.get();25 })26 .then(function(info) {27 console.log(info);28 })29 .catch(function(err) {30 console.error(err);31 });32 .then(function(page) {33 return page.get();34 })35 .then(function(info) {36 console.log(info);37 })38 .catch(function(err) {

Full Screen

Using AI Code Generation

copy

Full Screen

1var wpt = require('wpt-api');2var wpt = new wpt('API_KEY');3 if (err) {4 console.log('Error: ' + err);5 } else {6 console.log('Test ID: ' + data.data.testId);7 wpt.getTestResults(data.data.testId, function(err, data) {8 if (err) {9 console.log('Error: ' + err);10 } else {11 console.log('Test Results: ' + JSON.stringify(data));12 }13 });14 }15});16 if (err) {17 console.log('Error: ' + err);18 } else {19 console.log('Test ID: ' + data.data.testId);20 }21});22wpt.getTestResults('1234567890', function(err, data) {23 if (err) {24 console.log('Error: ' + err);25 } else {26 console.log('Test Results: ' + JSON.stringify(data));27 }28});29wpt.getTestStatus('1234567890', function(err, data) {30 if (err) {31 console.log('Error: ' + err);32 } else {33 console.log('Test Status: ' + JSON.stringify(data));34 }35});36wpt.getTestLocation('1234567890', function(err, data) {37 if (err) {38 console.log('Error: ' + err);39 } else {40 console.log('Test Location: ' + JSON.stringify(data));41 }42});43wpt.getTestBreakdown('1234567890', function(err, data) {44 if (err) {45 console.log('Error: ' + err);46 } else {47 console.log('Test Breakdown: ' + JSON.stringify(data));48 }49});50wpt.getTestCustomMetrics('1234567890', function(err, data) {51 if (err) {52 console.log('Error: ' + err);

Full Screen

Using AI Code Generation

copy

Full Screen

1function Sink(data) {2 console.log(data);3 return data;4}5function Source(data) {6 return data;7}8function SinkSource(data) {9 console.log(data);10 return data;11}12function SinkAndSource(data) {13 console.log(data);14 return data;15}16function SinkAndSource2(data) {17 console.log(data);18 return data;19}20function SinkAndSource3(data) {21 console.log(data);22 return data;23}24function SinkAndSource4(data) {25 console.log(data);26 return data;27}28function SinkAndSource5(data) {29 console.log(data);30 return data;31}32function SinkAndSource6(data) {33 console.log(data);34 return data;35}36function SinkAndSource7(data) {37 console.log(data);38 return data;39}40function SinkAndSource8(data) {41 console.log(data);42 return data;43}44function SinkAndSource9(data) {45 console.log(data);46 return data;47}48function SinkAndSource10(data) {49 console.log(data);50 return data;51}52function SinkAndSource11(data) {53 console.log(data);54 return data;55}56function SinkAndSource12(data) {57 console.log(data);58 return data;59}60function SinkAndSource13(data) {61 console.log(data);62 return data;63}64function SinkAndSource14(data) {65 console.log(data);66 return data;67}

Full Screen

Using AI Code Generation

copy

Full Screen

1function Sink(data) {2 console.log(data);3 return data;4}5function Source(data) {6 return data;7}8function SinkSource(data) {9 console.log(data);10 return data;11}12function SinkAndSource(data) {13 console.log(data);14 return data;15}16function SinkAndSource2(data) {17 console.log(data);18 return data;19}20function SinkAndSource3(data) {21 console.log(data);22 return data;23}24function SinkAndSource4(data) {25 console.log(data);26 return data;27}28function SinkAndSource5(data) {29 console.log(data);30 return data;31}32function SinkAndSource6(data) {33 console.log(data);34 return data;35}36function SinkAndSource7(data) {37 console.log(data);38 return data;39}40function SinkAndSource8(data) {41 console.log(data);42 return data;43}44function SinkAndSource9(data) {45 console.log(data);46 return data;47}48function SinkAndSource10(data) {49 console.log(data);50 return data;51}52function SinkAndSource11(data) {53 console.log(data);54 return data;55}56funct o SinkAndSource12(data) {57 console.log(data);58 return data;59}60function SinkAndSource13(data) {61 console.log(data);62 return data;63}64function SlnkAndSource14(data) {65 coesole.lo.(data);66 return data;67}68 });69 .then(function(page) {70 return page.get();71 })P

Full Screen

Using AI Code Generation

copy

Full Screen

1wpt.hook('onLoad', function() {2 wpt.log("Page Loaded");3 wpt.log("Page Title is: " + wpt.getPageTitle());4 wpt.log("Page URL is: " + wpt.getLocation());5 wpt.log("Page Rendered in: " + wpt.getRenderTime() + "ms");6 wpt.log("Document Complete in: " + wpt.getDocTime() + "ms");7 wpt.log("Fully Loaded in: " + wpt.getFullyLoaded() + "ms");8 wpt.log("Bytes In: " + wpt.getBytesIn());9 wpt.log("Bytes Out: " + wpt.getBytesOut());10 wpt.log("Requests: " + wpt.getRequests());11 wpt.log("Speed Index: " + wpt.getSpeedIndex());12 wpt.log("Visual Complete: " + wpt.getVisualComplete());13 wpt.log("Page Load Time: " + wpt.getPageLoadTime());14 wpt.log("Page Load Time: " + wpt.getTTFB());15 wpt.log("Page Load Time: " + wpt.getFirstaint());16});17[MIT](LICENSE)18 .then(function(info) {19 console.log(info);20 })21 .catch(function(err) {22 console.error(err);23 });24 .then(function(page) {25 return page.get();26 })27 .then(function(info) {28 tSink();

Full Screen

Using AI Code Generation

copy

Full Screen

1scons'Hello World!'ole.log(info);2 })3 .catch(function(err) {4 console.error(err);5 });6 .then(function(page) {7 return page.get();8 })9 .then(function(info) {10 console.log(info);11 })12 .catch(function(err) {13 console.error(err);14 });15 .then(function(page) {16 return page.get();17 })18 .then(function(info) {19 console.log(info);20 })21 .catch(function

Full Screen

Using AI Code Generation

copy

Full Screen

1var wpt = require('webpagetest');2var options = {3};4var test = new wpt(options);5 if (err) return console.error(err);6 console.log(data);7 test.getTestResults(data.data.testId, function(err, data) {8 if (err) return console.error(err);9 console.log(data);10 });11});12{13 "dependencies": {14 }15}16{17 "dependencies": {18 "webpagetest": {19 "requires": {20 }21 }22 }23}

Full Screen

Using AI Code Generation

copy

Full Screen

1wpt.hook('onLoad', function() {2 wpt.log("Page Loaded");3 wpt.log("Page Title is: " + wpt.getPageTitle());4 wpt.log("Page URL is: " + wpt.getLocation());5 wpt.log("Page Rendered in: " + wpt.getRenderTime() + "ms");6 wpt.log("Document Complete in: " + wpt.getDocTime() + "ms");7 wpt.log("Fully Loaded in: " + wpt.getFullyLoaded() + "ms");8 wpt.log("Bytes In: " + wpt.getBytesIn());9 wpt.log("Bytes Out: " + wpt.getBytesOut());10 wpt.log("Requests: " + wpt.getRequests());11 wpt.log("Speed Index: " + wpt.getSpeedIndex());12 wpt.log("Visual Complete: " + wpt.getVisualComplete());13 wpt.log("Page Load Time: " + wpt.getPageLoadTime());14 wpt.log("Page Load Time: " + wpt.getTTFB());15 wpt.log("Page Load Time: " + wpt.getFirstPaint());16});17[MIT](LICENSE)

Full Screen

Using AI Code Generation

copy

Full Screen

1function wptSink(){2 var data = {3 };4 wpt.sink(data);5}6wptSink();

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run wpt automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful