From 964d3ae801430d844c23ff4df45af7e9b4cd529b Mon Sep 17 00:00:00 2001 From: Aaron Plave Date: Thu, 18 Jul 2024 14:00:18 -0700 Subject: [PATCH 1/5] Time plugin docs --- docs/planning/plugins/introduction.mdx | 21 ++++++++ docs/planning/plugins/time.mdx | 66 ++++++++++++++++++++++++++ sidebars.js | 9 ++++ 3 files changed, 96 insertions(+) create mode 100644 docs/planning/plugins/introduction.mdx create mode 100644 docs/planning/plugins/time.mdx diff --git a/docs/planning/plugins/introduction.mdx b/docs/planning/plugins/introduction.mdx new file mode 100644 index 0000000..a599bb6 --- /dev/null +++ b/docs/planning/plugins/introduction.mdx @@ -0,0 +1,21 @@ +# Advanced - UI Plugins + +The Aerie UI provides an client-side API for customizing various aspects of the UI. This customization is accomplished by supplying the UI with specifically named javascript files in the `static/resources` directory of the application and enabling the plugins using runtime environment variables. These plugins are run in the Aerie UI browser context. The relevant portions of the API specification can be found on specific plugin pages below or for the entire specification please reference the Aerie UI [plugins.ts](https://github.com/NASA-AMMOS/aerie-ui/) type file (TODO make a link once merged). Plugins may also load additional supporting files from the `static/resources` directory or from external sources. Please note that additional resource requests to `static/resources/*` should be referenced as `/resources/*` given the client side routing setup. + +Plugins must export an asynchronous function named `getPlugin` that returns a subset of the Plugin API. + +```javascript +// Empty plugin example (.js) +export async function getPlugin() { + console.log('Plugin loaded'); + return { + /* Plugin contents */ + }; +} +``` + +## Supported Plugins + +| Plugin | Description | +| ------------------------------ | --------------------------------------------------- | +| [Time](/planning/plugins/time) | Customize how time is presented and input in the UI | diff --git a/docs/planning/plugins/time.mdx b/docs/planning/plugins/time.mdx new file mode 100644 index 0000000..e7c0b2c --- /dev/null +++ b/docs/planning/plugins/time.mdx @@ -0,0 +1,66 @@ +# Time Plugin + +Time input and presentation in the Aerie UI can be customized by implementing a time plugin. Currently the time plugin is only used on the plans and individual plan page. This time plugin does not affect how time is stored in the database and instead converts times from the database format to the plugin format on the fly in the UI. + +Example use cases for the Time Plugin: + +- Displaying times in a particular timezone +- Displaying and inputting times in a custom time such as LMST, SCLK, etc + +## Configuration + +- The Time Plugin must be named `time-plugin.js` and must be placed inside of the `static/resources` directory of the Aerie UI. +- Set `PUBLIC_TIME_PLUGIN_ENABLED=true` in your runtime environment. + +## Time Plugin API + +The Time Plugin must return a `time` object from a `getPlugin` function with the following optional properties: + +| Property | Type | Description | +| ----------------------- | ------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `primary` | PluginTime | See below for a definition of the `PluginTime` type.
Default: UTC DOY parsing and input | +| `additional` | Optional[] | Additional time formats that must supply at least the `format` and a `parse` functions. These additional time formats are used in the plan timeline secondary time displays as well as other secondary time displays in the plan page.
Default: User's local timezone | +| `enableDatePicker` | boolean | If true, show a UTC date picker. Disable this when the plugin does not use a primary time of UTC.
Default: `true` | +| `getDefaultPlanEndDate` | (start: Date) => Date \| null | Compute a plan end date given a plan start date
Default: Add one Earth day to the start date | +| `ticks` | Object | See below for the properties of `ticks` | +| `ticks.getTicks` | (start: Date, stop: Date, count: number) => Date[] | Return an array of `Date` objects given a start `Date`, a stop `Date`, and a target count of ticks. This function allows for cleanly lining up ticks with the plugin's primary time system.
Default: UTC based time ticks | +| `ticks.maxLabelWidth` | number | The maximum width in pixels of any tick label. Used internally by the Aerie UI timeline to compute the number of ticks that should be displayed in the timeline.
Default: 130 | + +
+ +The `PluginTime` type is defined by the following optional properties: + +| Property | Type | Description | +| -------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| `format` | (date: Date) => string \| null | Convert a `Date` to a human readable `string`.
Default: UTC DOY `YYYY-DDDThh:mm:ss.SSS` | +| `formatShort` | (date: Date) => string \| null | Convert a `Date` to a short human readable `string`.
Default: UTC DOY `YYYY-DDD` | +| `formatString` | string | Format that users should adhere to for string date entry.
Default: `YYYY-DDDThh:mm:ss` | +| `formatTick` | (date: Date, durationMs: number, tickCount: number) => string \| null | Format a timeline tick given a `Date`, tick window duration, and number of ticks.
Default: Dynamic UTC date formatting | +| `label` | string | Label for the time format.
Default: UTC | +| `parse` | (dateString: string) => Date \| null | Convert a string representation of a date to a `Date` object.
Default: Native Javascript `Date` parsing | +| `validate` | (dateString: string) => string \| null | Return an error string if the given date string is invalid, otherwise return null.
Default: UTC date string validation | + +## Error handling + +The Time Plugin is responsible for gracefully failing when exceptions are encountered within the plugin. When an operation such as `parse` or `format` fails, the plugin should return `null` to indicate to the Aerie UI that an error occurred and that the date is invalid. + +## Example Plugins + +Below is a basic example that sets the additional time formats to a single format that displays the current UTC year. For additional plugin examples, please refer to the [aerie-ui-plugins](https://github.com/NASA-AMMOS/aerie-ui-plugin-examples) repository. + +```javascript +// Time plugin example (time-plugin.js) +export async function getPlugin() { + console.log('Plugin loaded'); + return { + time: { + additional: [ + { + format: (date: Date) => date.getUTCFullYear().toString(), + parse: (dateString: string) => new Date(string), + }, + ], + }, + }; +} +``` diff --git a/sidebars.js b/sidebars.js index ad11f18..9a1d5ac 100644 --- a/sidebars.js +++ b/sidebars.js @@ -158,6 +158,15 @@ const sidebars = { 'planning/timeline-controls', 'planning/advanced-incons', 'planning/advanced-extensions', + { + type: 'category', + label: 'Advanced - UI Plugins', + link: { + id: 'planning/plugins/introduction', + type: 'doc', + }, + items: ['planning/plugins/time'], + }, ], }, { From 7d2cdf0c41bfc747f63493d91c588e19f70aae24 Mon Sep 17 00:00:00 2001 From: Aaron Plave Date: Thu, 18 Jul 2024 16:01:46 -0700 Subject: [PATCH 2/5] Add keyboard shortcut for holding shift to see additional time formats in the timeline tooltip --- docs/keyboard-shortcuts.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/keyboard-shortcuts.mdx b/docs/keyboard-shortcuts.mdx index 34e2b8c..e7652f2 100644 --- a/docs/keyboard-shortcuts.mdx +++ b/docs/keyboard-shortcuts.mdx @@ -30,6 +30,7 @@ The easiest way to navigate the timeline is by holding - ctrl + T toggles the cursor visibility - 0 resets the timeline zoom - delete or backspace deletes selected activity directive +- shift when held shows additional time formats within the timeline tooltip
From f86d6e7fc01553ae24a1a5fefacb825fdccbf117 Mon Sep 17 00:00:00 2001 From: Aaron Plave Date: Mon, 22 Jul 2024 12:54:59 -0700 Subject: [PATCH 3/5] Update link --- docs/planning/plugins/introduction.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/planning/plugins/introduction.mdx b/docs/planning/plugins/introduction.mdx index a599bb6..c168448 100644 --- a/docs/planning/plugins/introduction.mdx +++ b/docs/planning/plugins/introduction.mdx @@ -1,6 +1,6 @@ # Advanced - UI Plugins -The Aerie UI provides an client-side API for customizing various aspects of the UI. This customization is accomplished by supplying the UI with specifically named javascript files in the `static/resources` directory of the application and enabling the plugins using runtime environment variables. These plugins are run in the Aerie UI browser context. The relevant portions of the API specification can be found on specific plugin pages below or for the entire specification please reference the Aerie UI [plugins.ts](https://github.com/NASA-AMMOS/aerie-ui/) type file (TODO make a link once merged). Plugins may also load additional supporting files from the `static/resources` directory or from external sources. Please note that additional resource requests to `static/resources/*` should be referenced as `/resources/*` given the client side routing setup. +The Aerie UI provides an client-side API for customizing various aspects of the UI. This customization is accomplished by supplying the UI with specifically named javascript files in the `static/resources` directory of the application and enabling the plugins using runtime environment variables. These plugins are run in the Aerie UI browser context. The relevant portions of the API specification can be found on specific plugin pages below or for the entire specification please reference the Aerie UI [plugin.ts](https://github.com/NASA-AMMOS/aerie-ui/blob/develop/src/types/plugin.ts) type file. Plugins may also load additional supporting files from the `static/resources` directory or from external sources. Please note that additional resource requests to `static/resources/*` should be referenced as `/resources/*` given the client side routing setup. Plugins must export an asynchronous function named `getPlugin` that returns a subset of the Plugin API. From 27b821d35d1086b428259e028a46eb11c4b940eb Mon Sep 17 00:00:00 2001 From: dandelany Date: Wed, 24 Jul 2024 13:47:33 -0700 Subject: [PATCH 4/5] fix typo in time plugin docs --- docs/planning/plugins/time.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/planning/plugins/time.mdx b/docs/planning/plugins/time.mdx index e7c0b2c..91e2466 100644 --- a/docs/planning/plugins/time.mdx +++ b/docs/planning/plugins/time.mdx @@ -46,7 +46,7 @@ The Time Plugin is responsible for gracefully failing when exceptions are encoun ## Example Plugins -Below is a basic example that sets the additional time formats to a single format that displays the current UTC year. For additional plugin examples, please refer to the [aerie-ui-plugins](https://github.com/NASA-AMMOS/aerie-ui-plugin-examples) repository. +Below is a basic example that sets the additional time formats to a single format that displays the current UTC year. For additional plugin examples, please refer to the [aerie-ui-plugin-examples](https://github.com/NASA-AMMOS/aerie-ui-plugin-examples) repository. ```javascript // Time plugin example (time-plugin.js) From 1a21f006b7d06dd852a7e97865395aa208ccb359 Mon Sep 17 00:00:00 2001 From: dandelany Date: Wed, 24 Jul 2024 16:42:25 -0700 Subject: [PATCH 5/5] docs for plan import/export --- docs/planning/assets/export-plan.png | Bin 0 -> 24063 bytes docs/planning/plan-import-export.mdx | 41 +++++++++++++++++++++++++++ sidebars.js | 1 + 3 files changed, 42 insertions(+) create mode 100644 docs/planning/assets/export-plan.png create mode 100644 docs/planning/plan-import-export.mdx diff --git a/docs/planning/assets/export-plan.png b/docs/planning/assets/export-plan.png new file mode 100644 index 0000000000000000000000000000000000000000..42181fc6c72d70ca64fdf6b07e521f57ab925a51 GIT binary patch literal 24063 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 jy+8&2T~?SRKV`3HIp!Q=)Um}kl6 + Aerie UI - Export Plan from Plan Metadata panel + + +## Importing a plan + +On the Plans page, you can select an Aerie plan file to upload when creating a new plan. This will pre-populate +the other fields from the plan file, but you will still need to select a mission model file to associate with your plan. + +There is currently no validation to check that the associated mission model is the same as the one used to create the +plan originally. This allows you to test the same plans with different models, but you may experience errors during +simulation or scheduling if the activities in the plan file don't match those in the model. + + diff --git a/sidebars.js b/sidebars.js index 9a1d5ac..87706f2 100644 --- a/sidebars.js +++ b/sidebars.js @@ -156,6 +156,7 @@ const sidebars = { 'planning/ui-views', 'planning/timeline-editing', 'planning/timeline-controls', + 'planning/plan-import-export', 'planning/advanced-incons', 'planning/advanced-extensions', {