@lblod/ember-rdfa-editor 13.1.1 → 13.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +12 -9
  2. package/declarations/components/_private/common/configurable-rdfa-display.d.ts +4 -4
  3. package/declarations/components/editor.d.ts +2 -0
  4. package/declarations/components/toolbar/button.d.ts +1 -1
  5. package/declarations/core/say-controller.d.ts +11 -4
  6. package/declarations/core/say-data-factory/blank-node.d.ts +1 -1
  7. package/declarations/core/say-data-factory/default-graph.d.ts +1 -1
  8. package/declarations/core/say-data-factory/literal.d.ts +1 -1
  9. package/declarations/core/say-data-factory/named-node.d.ts +1 -1
  10. package/declarations/core/say-data-factory/prosemirror-terms/content-literal.d.ts +1 -1
  11. package/declarations/core/say-data-factory/prosemirror-terms/literal-node.d.ts +1 -1
  12. package/declarations/core/say-data-factory/prosemirror-terms/resource-node.d.ts +1 -1
  13. package/declarations/core/say-data-factory/quad.d.ts +1 -1
  14. package/declarations/core/say-data-factory/variable.d.ts +1 -1
  15. package/declarations/core/say-editor.d.ts +1 -0
  16. package/declarations/core/say-view.d.ts +7 -1
  17. package/declarations/utils/_private/rdfa-parser/util.d.ts +1 -1
  18. package/dist/commands/_private/rdfa-commands/remove-backlink.js +1 -1
  19. package/dist/commands/_private/rdfa-commands/select-node-by-rdfa-id.js +1 -1
  20. package/dist/commands/_private/rdfa-commands/select-node-by-subject.js +1 -1
  21. package/dist/commands/_private/rdfa-commands/wrap-inline-resource.js +1 -1
  22. package/dist/commands/_private/rdfa-commands/wrap-literal.js +1 -1
  23. package/dist/commands/_private/rdfa-commands/wrap-resource.js +1 -1
  24. package/dist/commands/rdfa-commands/add-property.js +1 -1
  25. package/dist/commands/rdfa-commands/remove-property.js +1 -1
  26. package/dist/components/_private/attribute-editor/index.js +1 -1
  27. package/dist/components/_private/attribute-editor/index.js.map +1 -1
  28. package/dist/components/_private/common/configurable-rdfa-display.js +1 -1
  29. package/dist/components/_private/common/configurable-rdfa-display.js.map +1 -1
  30. package/dist/components/_private/common/property-details.js +1 -1
  31. package/dist/components/_private/node-controls/wrapping-utils.js +2 -2
  32. package/dist/components/_private/node-controls/wrapping-utils.js.map +1 -1
  33. package/dist/components/_private/rdfa-visualiser/rdfa-explorer.js +1 -1
  34. package/dist/components/_private/rdfa-visualiser/resource-info.js +1 -1
  35. package/dist/components/_private/rdfa-visualiser/visualiser-card.js +1 -1
  36. package/dist/components/collapsible.js +1 -1
  37. package/dist/components/collapsible.js.map +1 -1
  38. package/dist/components/editor.js +7 -1
  39. package/dist/components/editor.js.map +1 -1
  40. package/dist/components/ember-node/embedded-editor.js +4 -1
  41. package/dist/components/ember-node/embedded-editor.js.map +1 -1
  42. package/dist/components/plugins/history/redo.js +1 -1
  43. package/dist/components/plugins/history/undo.js +1 -1
  44. package/dist/components/plugins/list/ordered.js +1 -1
  45. package/dist/components/plugins/list/unordered.js +1 -1
  46. package/dist/components/toolbar/mark.js +1 -1
  47. package/dist/core/keymap.js +2 -2
  48. package/dist/core/rdfa-types.js +1 -1
  49. package/dist/core/say-controller.js +41 -5
  50. package/dist/core/say-controller.js.map +1 -1
  51. package/dist/core/say-data-factory/blank-node.js +2 -2
  52. package/dist/core/say-data-factory/blank-node.js.map +1 -1
  53. package/dist/core/say-data-factory/default-graph.js +2 -2
  54. package/dist/core/say-data-factory/default-graph.js.map +1 -1
  55. package/dist/core/say-data-factory/literal.js +2 -2
  56. package/dist/core/say-data-factory/literal.js.map +1 -1
  57. package/dist/core/say-data-factory/named-node.js +2 -2
  58. package/dist/core/say-data-factory/named-node.js.map +1 -1
  59. package/dist/core/say-data-factory/prosemirror-terms/content-literal.js +2 -2
  60. package/dist/core/say-data-factory/prosemirror-terms/content-literal.js.map +1 -1
  61. package/dist/core/say-data-factory/prosemirror-terms/literal-node.js +2 -2
  62. package/dist/core/say-data-factory/prosemirror-terms/literal-node.js.map +1 -1
  63. package/dist/core/say-data-factory/prosemirror-terms/resource-node.js +2 -2
  64. package/dist/core/say-data-factory/prosemirror-terms/resource-node.js.map +1 -1
  65. package/dist/core/say-data-factory/quad.js +2 -2
  66. package/dist/core/say-data-factory/quad.js.map +1 -1
  67. package/dist/core/say-data-factory/variable.js +2 -2
  68. package/dist/core/say-data-factory/variable.js.map +1 -1
  69. package/dist/core/say-editor.js +4 -2
  70. package/dist/core/say-editor.js.map +1 -1
  71. package/dist/core/say-view.js +2 -1
  72. package/dist/core/say-view.js.map +1 -1
  73. package/dist/index-CxRqg5Kr.js +671 -0
  74. package/dist/index-CxRqg5Kr.js.map +1 -0
  75. package/dist/index.js +1 -1
  76. package/dist/{main-dUbkrxFL.js → main-DFf-0En3.js} +7988 -8105
  77. package/dist/main-DFf-0En3.js.map +1 -0
  78. package/dist/nodes/invisible-rdfa.js +1 -1
  79. package/dist/plugins/history/index.js +1 -1
  80. package/dist/plugins/list/commands/lift-out-of-nested-lists.js +1 -1
  81. package/dist/plugins/rdfa-info/index.js +1 -1
  82. package/dist/plugins/rdfa-info/types.js +1 -1
  83. package/dist/plugins/remove-properties-of-deleted-nodes/index.js +1 -1
  84. package/dist/utils/_private/datastore/graphy-dataset.js +1 -1
  85. package/dist/utils/_private/ember-node.js +0 -2
  86. package/dist/utils/_private/ember-node.js.map +1 -1
  87. package/dist/utils/_private/rdfa-parser/util.js +1 -8
  88. package/dist/utils/_private/rdfa-parser/util.js.map +1 -1
  89. package/package.json +8 -7
  90. package/declarations/components/toolbar.d.ts +0 -1
  91. package/dist/main-dUbkrxFL.js.map +0 -1
package/README.md CHANGED
@@ -278,8 +278,19 @@ You can discover additional examples on how to write Prosemirror schemas, plugin
278
278
  ## Styling
279
279
 
280
280
  Ember-rdfa-editor requires users of the addon to import its SASS stylesheets as well as those of appuniversum.
281
+ You need to add imports for the bundled styles:
281
282
 
282
- For newer Ember apps, this is a matter of renaming your `app.css` file to `app.scss` and importing it in your `app/app.ts` file.
283
+ ```
284
+ /* app/styles/app.scss */
285
+ @import "@appuniversum/ember-appuniversum/styles";
286
+ @import "@lblod/ember-rdfa-editor";
287
+ ```
288
+
289
+ For newer Ember apps, this is a matter of renaming your `app.css` file to `app.scss` and importing it in your `app/app.ts` file and installing `sass`:
290
+
291
+ ```sh
292
+ pnpm install --save-dev sass
293
+ ```
283
294
 
284
295
  ```javascript
285
296
  // app/app.ts
@@ -288,14 +299,6 @@ import './styles/app.scss';
288
299
 
289
300
  For older Ember apps you'll need to [install ember-cli-sass](https://github.com/adopted-ember-addons/ember-cli-sass#installation).
290
301
 
291
- You then need to add imports for the bundled styles:
292
-
293
- ```
294
- /* app/styles/app.scss */
295
- @import "@appuniversum/ember-appuniversum/styles";
296
- @import "@lblod/ember-rdfa-editor";
297
- ```
298
-
299
302
  ### Customisation
300
303
 
301
304
  This addon uses CSS variables to customise the styling. You can override these variables by including and overriding the following variables:
@@ -2,11 +2,11 @@ import Component from '@glimmer/component';
2
2
  import type { ComponentLike } from '@glint/template';
3
3
  import { type OutgoingTriple } from '#root/core/rdfa-processor.ts';
4
4
  import { type DisplayElement, type DisplayGenerator, type DisplayMeta, type GeneratorContext } from '#root/plugins/rdfa-info/types.ts';
5
- interface SpanSig {
5
+ interface HTMLElementSig {
6
6
  Blocks: {
7
7
  default: [];
8
8
  };
9
- Element: HTMLSpanElement;
9
+ Element: HTMLElement;
10
10
  }
11
11
  export declare const predicateDisplay: DisplayGenerator<OutgoingTriple>;
12
12
  interface Sig<T> {
@@ -14,7 +14,7 @@ interface Sig<T> {
14
14
  context: GeneratorContext;
15
15
  value: T;
16
16
  generator: DisplayGenerator<T>;
17
- wrapper?: ComponentLike<SpanSig>;
17
+ wrapper?: ComponentLike<HTMLElementSig>;
18
18
  };
19
19
  Blocks: {
20
20
  default: [];
@@ -25,6 +25,6 @@ export default class ConfigurableRdfaDisplay<T> extends Component<Sig<T>> {
25
25
  get elements(): DisplayElement[];
26
26
  get meta(): DisplayMeta;
27
27
  get isHidden(): boolean;
28
- get wrapperComponent(): ComponentLike<SpanSig>;
28
+ get wrapperComponent(): ComponentLike<HTMLElementSig>;
29
29
  }
30
30
  export {};
@@ -24,6 +24,7 @@ export interface RdfaEditorArgs {
24
24
  };
25
25
  defaultAttrGenerators?: DefaultAttrGenPuginOptions;
26
26
  keyMapOptions?: KeymapOptions;
27
+ editable?: boolean;
27
28
  notificationCallback?: (notification: Notification) => void;
28
29
  notificationToaster?: boolean;
29
30
  }
@@ -55,6 +56,7 @@ export default class RdfaEditor extends Component<RdfaEditorArgs> {
55
56
  private prosemirror;
56
57
  get initializers(): Promise<void>[];
57
58
  get baseIRI(): string;
59
+ get editable(): boolean | undefined;
58
60
  get notificationToaster(): boolean;
59
61
  /**
60
62
  * Handle init of rawEditor
@@ -25,6 +25,6 @@ type Signature = {
25
25
  export default class ToolbarButton extends Component<Signature> {
26
26
  get optionsIcon(): ComponentLike<{
27
27
  Element: Element;
28
- }> | import("@ember/component/template-only").TOC<import("@appuniversum/ember-appuniversum/components/icons/chevron-down").ChevronDownIconSignature>;
28
+ }> | import("@ember/component/template-only").TOC<import("@appuniversum/ember-appuniversum/components/icons/chevron-down.js").ChevronDownIconSignature>;
29
29
  }
30
30
  export {};
@@ -1,11 +1,12 @@
1
- import { SayStore } from '#root/utils/_private/datastore/say-store.ts';
2
1
  import type Owner from '@ember/owner';
3
- import SayView, { type SetHtmlOptions } from '#root/core/say-view.ts';
4
- import type SayEditor from '#root/core/say-editor.ts';
5
2
  import { type Attrs, MarkType, Schema } from 'prosemirror-model';
6
3
  import { type Command, EditorState, Transaction } from 'prosemirror-state';
4
+ import { SayStore } from '#root/utils/_private/datastore/say-store.ts';
5
+ import SayView, { type SetHtmlOptions } from '#root/core/say-view.ts';
6
+ import type SayEditor from '#root/core/say-editor.ts';
7
7
  export default class SayController {
8
8
  private readonly editor;
9
+ private savedStateId?;
9
10
  constructor(pm: SayEditor);
10
11
  get externalContextStore(): SayStore;
11
12
  get mainEditorView(): SayView;
@@ -15,15 +16,21 @@ export default class SayController {
15
16
  get htmlContent(): string;
16
17
  get inEmbeddedView(): boolean;
17
18
  get domParser(): import("prosemirror-model").DOMParser;
19
+ get editable(): boolean;
20
+ setEditable(editable: boolean): void;
18
21
  clone(): SayController;
19
22
  focus(): void;
20
23
  setActiveView(view: SayView): void;
24
+ /** Is the editor in the same state as the last time it was marked as clean */
25
+ get isDirty(): boolean;
26
+ /** Mark the history state at which the document will be considered 'clean' */
27
+ markClean(): void;
21
28
  /**
22
29
  * Replaces the state (and current document) with a parsed version of the provided `html` string.
23
30
  * This method creates a new `doc` node and parses it correctly based on the provided html.
24
31
  * Note: plugin state is not preserved when using this method (e.g. the history-plugin state is reset).
25
32
  */
26
- initialize(html: string, { shouldFocus, doNotClean, }?: Exclude<SetHtmlOptions, 'range'>): void;
33
+ initialize(html: string, { shouldFocus, doNotClean, startsDirty, }?: Exclude<SetHtmlOptions, 'range'>): void;
27
34
  /**
28
35
  * setHtmlContent replaces the content of the current document with the provided html
29
36
  * Note: it does not create a new `doc` node and does not update the `doc` node based on the provided html
@@ -8,7 +8,7 @@ export declare class SayBlankNode implements RDF.BlankNode {
8
8
  readonly termType = "BlankNode";
9
9
  readonly value: string;
10
10
  constructor(value: string);
11
- equals: (other?: Option<SayTerm>) => boolean;
11
+ equals(other?: Option<SayTerm>): boolean;
12
12
  toJSON(): {
13
13
  termType: string;
14
14
  value: string;
@@ -10,5 +10,5 @@ export declare class SayDefaultGraph implements RDF.DefaultGraph {
10
10
  readonly termType = "DefaultGraph";
11
11
  readonly value = "";
12
12
  private constructor();
13
- equals: (other?: Option<SayTerm>) => other is RDF.DefaultGraph;
13
+ equals(other?: Option<SayTerm>): other is RDF.DefaultGraph;
14
14
  }
@@ -12,7 +12,7 @@ export declare class SayLiteral implements RDF.Literal {
12
12
  static readonly RDF_LANGUAGE_STRING: RDF.NamedNode;
13
13
  static readonly XSD_STRING: RDF.NamedNode;
14
14
  constructor(value: string, languageOrDatatype?: string | RDF.NamedNode);
15
- equals: (other?: Option<SayTerm>) => boolean;
15
+ equals(other?: Option<SayTerm>): boolean;
16
16
  toJSON(): {
17
17
  termType: string;
18
18
  value: string;
@@ -8,7 +8,7 @@ export declare class SayNamedNode<Iri extends string = string> implements RDF.Na
8
8
  readonly termType = "NamedNode";
9
9
  readonly value: Iri;
10
10
  constructor(value: Iri);
11
- equals: (other?: Option<SayTerm>) => boolean;
11
+ equals(other?: Option<SayTerm>): boolean;
12
12
  toJSON(): {
13
13
  termType: string;
14
14
  value: Iri;
@@ -13,7 +13,7 @@ export declare class ContentLiteralTerm {
13
13
  static readonly RDF_LANGUAGE_STRING: SayNamedNode<"http://www.w3.org/1999/02/22-rdf-syntax-ns#langString">;
14
14
  static readonly XSD_STRING: SayNamedNode<"http://www.w3.org/2001/XMLSchema#string">;
15
15
  constructor(languageOrDatatype?: string | RDF.NamedNode);
16
- equals: (other?: Option<SayTerm>) => boolean;
16
+ equals(other?: Option<SayTerm>): boolean;
17
17
  toJSON(): {
18
18
  termType: string;
19
19
  value: string;
@@ -7,7 +7,7 @@ export declare class LiteralNodeTerm {
7
7
  readonly termType = "LiteralNode";
8
8
  readonly value: string;
9
9
  constructor(value: string);
10
- equals: (other?: Option<SayTerm>) => boolean;
10
+ equals(other?: Option<SayTerm>): boolean;
11
11
  toJSON(): {
12
12
  termType: string;
13
13
  value: string;
@@ -7,7 +7,7 @@ export declare class ResourceNodeTerm<Iri extends string = string> {
7
7
  readonly termType = "ResourceNode";
8
8
  readonly value: Iri;
9
9
  constructor(value: Iri);
10
- equals: (other?: Option<SayTerm>) => boolean;
10
+ equals(other?: Option<SayTerm>): boolean;
11
11
  toJSON(): {
12
12
  termType: string;
13
13
  value: Iri;
@@ -13,5 +13,5 @@ export declare class SayQuad implements RDF.BaseQuad {
13
13
  readonly termType = "Quad";
14
14
  readonly value = "";
15
15
  constructor(subject: RDF.Term, predicate: RDF.Term, object: RDF.Term, graph: RDF.Term);
16
- equals: (other?: Option<SayTerm>) => boolean;
16
+ equals(other?: Option<SayTerm>): boolean;
17
17
  }
@@ -8,7 +8,7 @@ export declare class SayVariable implements RDF.Variable {
8
8
  readonly termType = "Variable";
9
9
  readonly value: string;
10
10
  constructor(value: string);
11
- equals: (other?: Option<SayTerm>) => boolean;
11
+ equals(other?: Option<SayTerm>): boolean;
12
12
  toJSON(): {
13
13
  termType: string;
14
14
  value: string;
@@ -22,6 +22,7 @@ export interface SayEditorArgs {
22
22
  plugins?: PluginConfig;
23
23
  nodeViews?: (controller: SayController) => Record<string, NodeViewConstructor>;
24
24
  defaultAttrGenerators?: DefaultAttrGenPuginOptions;
25
+ editable?: SayView['props']['editable'];
25
26
  }
26
27
  export default class SayEditor {
27
28
  mainView: SayView;
@@ -10,6 +10,11 @@ export interface SetHtmlOptions {
10
10
  * Defaults to false.
11
11
  */
12
12
  doNotClean?: boolean;
13
+ /**
14
+ * Whether the initial state should be considered as a 'dirty' state e.g. if this is a new
15
+ * document that has not yet been saved.
16
+ */
17
+ startsDirty?: boolean;
13
18
  }
14
19
  export type DocumentRange = {
15
20
  from: number;
@@ -26,7 +31,8 @@ export default class SayView extends EditorView {
26
31
  /**
27
32
  * Replaces the state (and current document) with a parsed version of the provided `html` string.
28
33
  * This method creates a new `doc` node and parses it correctly based on the provided html.
29
- * Note: plugin state is not preserved when using this method (e.g. the history-plugin state is reset).
34
+ * Note: plugin state is preserved but a new transaction setting the new content will be
35
+ * dispatched.
30
36
  */
31
37
  setHtmlContent(content: string, options?: SetHtmlOptions): void;
32
38
  get htmlContent(): string;
@@ -8,7 +8,7 @@ import type { IActiveTag } from './active-tag.ts';
8
8
  import { type RdfaProfile } from './rdfa-profile.ts';
9
9
  import { DataFactory } from 'rdf-data-factory';
10
10
  import type { ModelBlankNode, ModelLiteral, ModelNamedNode, ModelQuad, ModelQuadObject, ModelQuadPredicate, ModelQuadSubject, ModelTerm } from '#root/utils/_private/rdfa-parser/rdfa-parser.ts';
11
- export declare class ModelDataFactory<N> extends DataFactory {
11
+ export declare class ModelDataFactory<N> extends DataFactory<ModelQuad<N>> {
12
12
  quad(subject: ModelQuadSubject<N>, predicate: ModelQuadPredicate<N>, object: ModelQuadObject<N>, graph: Quad_Graph): ModelQuad<N>;
13
13
  namedNode<N, I extends string = string>(iri: I, node?: N): ModelNamedNode<N, I>;
14
14
  blankNode(value?: string, node?: N): ModelBlankNode<N>;
@@ -3,7 +3,7 @@ import 'uuid';
3
3
  import '../../../utils/_private/constants.js';
4
4
  import 'relative-to-absolute-iri';
5
5
  import 'rdf-data-factory';
6
- import '../../../main-dUbkrxFL.js';
6
+ import '../../../main-DFf-0En3.js';
7
7
  import '../../../core/say-data-factory/data-factory.js';
8
8
  import '../../../core/say-data-factory/default-graph.js';
9
9
  import '../../../config/rdfa.js';
@@ -3,7 +3,7 @@ import 'uuid';
3
3
  import '../../../utils/_private/constants.js';
4
4
  import 'relative-to-absolute-iri';
5
5
  import 'rdf-data-factory';
6
- import '../../../main-dUbkrxFL.js';
6
+ import '../../../main-DFf-0En3.js';
7
7
  import '../../../core/say-data-factory/data-factory.js';
8
8
  import '../../../core/say-data-factory/default-graph.js';
9
9
  import '../../../config/rdfa.js';
@@ -3,7 +3,7 @@ import 'uuid';
3
3
  import '../../../utils/_private/constants.js';
4
4
  import 'relative-to-absolute-iri';
5
5
  import 'rdf-data-factory';
6
- import '../../../main-dUbkrxFL.js';
6
+ import '../../../main-DFf-0En3.js';
7
7
  import '../../../core/say-data-factory/data-factory.js';
8
8
  import '../../../core/say-data-factory/default-graph.js';
9
9
  import '../../../config/rdfa.js';
@@ -4,7 +4,7 @@ import 'prosemirror-model';
4
4
  import '../../../utils/_private/constants.js';
5
5
  import 'relative-to-absolute-iri';
6
6
  import 'rdf-data-factory';
7
- import '../../../main-dUbkrxFL.js';
7
+ import '../../../main-DFf-0En3.js';
8
8
  import '../../../core/say-data-factory/data-factory.js';
9
9
  import '../../../core/say-data-factory/default-graph.js';
10
10
  import '../../../config/rdfa.js';
@@ -4,7 +4,7 @@ import '../../../utils/_private/constants.js';
4
4
  import 'prosemirror-model';
5
5
  import 'relative-to-absolute-iri';
6
6
  import 'rdf-data-factory';
7
- import '../../../main-dUbkrxFL.js';
7
+ import '../../../main-DFf-0En3.js';
8
8
  import '../../../core/say-data-factory/data-factory.js';
9
9
  import '../../../core/say-data-factory/default-graph.js';
10
10
  import '../../../config/rdfa.js';
@@ -5,7 +5,7 @@ import '../../../utils/_private/constants.js';
5
5
  import 'prosemirror-model';
6
6
  import 'relative-to-absolute-iri';
7
7
  import 'rdf-data-factory';
8
- import '../../../main-dUbkrxFL.js';
8
+ import '../../../main-DFf-0En3.js';
9
9
  import '../../../core/say-data-factory/data-factory.js';
10
10
  import '../../../core/say-data-factory/default-graph.js';
11
11
  import '../../../config/rdfa.js';
@@ -5,7 +5,7 @@ import 'uuid';
5
5
  import '../../utils/_private/constants.js';
6
6
  import 'relative-to-absolute-iri';
7
7
  import 'rdf-data-factory';
8
- import '../../main-dUbkrxFL.js';
8
+ import '../../main-DFf-0En3.js';
9
9
  import '../../config/rdfa.js';
10
10
  import 'iter-tools';
11
11
  import TransformUtils from '../../utils/_private/transform-utils.js';
@@ -3,7 +3,7 @@ import 'uuid';
3
3
  import '../../utils/_private/constants.js';
4
4
  import 'relative-to-absolute-iri';
5
5
  import 'rdf-data-factory';
6
- import '../../main-dUbkrxFL.js';
6
+ import '../../main-DFf-0En3.js';
7
7
  import '../../core/say-data-factory/data-factory.js';
8
8
  import '../../core/say-data-factory/default-graph.js';
9
9
  import '../../config/rdfa.js';
@@ -108,7 +108,7 @@ class AttributeEditor extends Component {
108
108
  return this.nodespec?.attrs?.[attr].editor;
109
109
  };
110
110
  static {
111
- setComponentTemplate(precompileTemplate("\n <WithUniqueId as |formId|>\n <HeadlessForm id={{formId}} @data={{this.nodeAttrs}} @onSubmit={{this.saveChanges}} as |form|>\n <AuCard @size=\"small\" @expandable={{true}} @manualControl={{true}} @openSection={{this.toggleSection}} @isExpanded={{this.expanded}} @disableAuContent={{true}} as |c|>\n <c.header class=\"say-flex-grow\">\n <AuToolbar class=\"au-u-flex au-u-flex-row au-u-flex--space-between\" as |Group|>\n <Group>\n <AuHeading @level=\"1\" @skin=\"6\">Node attributes</AuHeading>\n </Group>\n <Group>\n <AuButtonGroup>\n {{#if this.isEditing}}\n <AuButton @skin=\"link-secondary\" @iconAlignment=\"right\" {{on \"click\" (fn this.cancelEditing form.reset)}}>\n Cancel\n </AuButton>\n <AuButton @skin=\"link\" type=\"submit\" @icon={{CheckIcon}} onclick=\"event.stopPropagation();\" @iconAlignment=\"right\">\n Save\n </AuButton>\n {{else}}\n <AuButton @skin=\"link\" @icon={{PencilIcon}} @iconAlignment=\"right\" {{on \"click\" this.enableEditingMode}}>\n Edit\n </AuButton>\n {{/if}}\n </AuButtonGroup>\n </Group>\n </AuToolbar>\n\n </c.header>\n <c.content class=\"au-c-content--tiny\">\n\n <AuList @divider={{true}} as |Item|>\n {{#each-in this.nodeAttrs as |key value|}}\n <Item>\n <div class=\"au-u-padding-tiny\">\n {{#if (and this.isEditing (this.isEditable key))}}\n <form.Field @name={{key}} as |field|>\n <AuLabel for={{field.id}}>\n {{key}}\n </AuLabel>\n {{#let (this.editorComponent key) as |EditorComponent|}}\n {{#if EditorComponent}}\n {{!-- @glint-expect-error fix types of dynamic element --}}\n <EditorComponent id={{field.id}} value={{field.value}} name={{key}} {{!-- @glint-expect-error glint has no Signature for the component--}} {{on \"change\" (fn this.setField field)}} />\n {{else}}\n <AuTextarea @width=\"block\" id={{field.id}} value={{field.value}} name={{key}} {{on \"change\" (fn this.setField field)}} />\n {{/if}}\n {{/let}}\n </form.Field>\n {{else}}\n <p><strong>{{key}}</strong></p>\n <pre class=\"say-attribute-editor__formatted-content\">{{if value (this.formatValue value) \"<No value>\"}}</pre>\n {{/if}}\n </div>\n </Item>\n {{/each-in}}\n </AuList>\n </c.content>\n </AuCard>\n </HeadlessForm>\n </WithUniqueId>\n ", {
111
+ setComponentTemplate(precompileTemplate("\n <WithUniqueId as |formId|>\n <HeadlessForm id={{formId}} @data={{this.nodeAttrs}} @onSubmit={{this.saveChanges}} as |form|>\n <AuCard @size=\"small\" @expandable={{true}} @manualControl={{true}} @openSection={{this.toggleSection}} @isExpanded={{this.expanded}} @disableAuContent={{true}} as |c|>\n <c.header class=\"say-flex-grow\">\n <AuToolbar class=\"au-u-flex au-u-flex-row au-u-flex--space-between\" as |Group|>\n <Group>\n <AuHeading @level=\"1\" @skin=\"6\">Node attributes</AuHeading>\n </Group>\n <Group>\n <AuButtonGroup>\n {{#if this.isEditing}}\n <AuButton @skin=\"link-secondary\" @iconAlignment=\"right\" {{on \"click\" (fn this.cancelEditing form.reset)}}>\n Cancel\n </AuButton>\n <AuButton @skin=\"link\" type=\"submit\" @icon={{CheckIcon}} onclick=\"event.stopPropagation();\" @iconAlignment=\"right\">\n Save\n </AuButton>\n {{else}}\n <AuButton @skin=\"link\" @icon={{PencilIcon}} @iconAlignment=\"right\" {{on \"click\" this.enableEditingMode}}>\n Edit\n </AuButton>\n {{/if}}\n </AuButtonGroup>\n </Group>\n </AuToolbar>\n\n </c.header>\n <c.content class=\"au-c-content--tiny\">\n\n <AuList @divider={{true}} as |Item|>\n {{#each-in this.nodeAttrs as |key value|}}\n <Item>\n <div class=\"au-u-padding-tiny\">\n {{#if (and this.isEditing (this.isEditable key))}}\n <form.Field @name={{key}} as |field|>\n <AuLabel for={{field.id}}>\n {{key}}\n </AuLabel>\n {{#let (this.editorComponent key) as |EditorComponent|}}\n {{#if EditorComponent}}\n <EditorComponent {{!-- @glint-expect-error fix signature of dynamic `EditorComponent` --}} id={{field.id}} value={{field.value}} name={{key}} {{on \"change\" (fn this.setField field)}} />\n {{else}}\n <AuTextarea @width=\"block\" id={{field.id}} value={{field.value}} name={{key}} {{on \"change\" (fn this.setField field)}} />\n {{/if}}\n {{/let}}\n </form.Field>\n {{else}}\n <p><strong>{{key}}</strong></p>\n <pre class=\"say-attribute-editor__formatted-content\">{{if value (this.formatValue value) \"<No value>\"}}</pre>\n {{/if}}\n </div>\n </Item>\n {{/each-in}}\n </AuList>\n </c.content>\n </AuCard>\n </HeadlessForm>\n </WithUniqueId>\n ", {
112
112
  strictMode: true,
113
113
  scope: () => ({
114
114
  WithUniqueId: WithUniqueIdComponent,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/_private/attribute-editor/index.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { localCopy } from 'tracked-toolbox';\nimport { HeadlessForm, type FormData } from 'ember-headless-form';\nimport type { HeadlessFormFieldComponentSignature } from 'ember-headless-form/-private/components/field';\nimport { on } from '@ember/modifier';\nimport { fn } from '@ember/helper';\nimport { and } from 'ember-truth-helpers';\nimport type { Attrs } from 'prosemirror-model';\nimport { CheckIcon } from '@appuniversum/ember-appuniversum/components/icons/check';\nimport { PencilIcon } from '@appuniversum/ember-appuniversum/components/icons/pencil';\nimport AuButtonGroup from '@appuniversum/ember-appuniversum/components/au-button-group';\nimport AuToolbar from '@appuniversum/ember-appuniversum/components/au-toolbar';\nimport AuList from '@appuniversum/ember-appuniversum/components/au-list';\nimport AuLabel from '@appuniversum/ember-appuniversum/components/au-label';\nimport AuHeading from '@appuniversum/ember-appuniversum/components/au-heading';\nimport AuButton from '@appuniversum/ember-appuniversum/components/au-button';\nimport AuTextarea from '@appuniversum/ember-appuniversum/components/au-textarea';\nimport SayController from '#root/core/say-controller.ts';\nimport type SayNodeSpec from '#root/core/say-node-spec.ts';\nimport TransformUtils from '#root/utils/_private/transform-utils.ts';\nimport type { ResolvedPNode } from '#root/utils/_private/types.ts';\nimport {\n transactionCombinator,\n type TransactionMonad,\n} from '#root/utils/transaction-utils.ts';\nimport WithUniqueId from '#root/components/_private/utils/with-unique-id.ts';\nimport AuCard from '@appuniversum/ember-appuniversum/components/au-card';\n\ntype Signature = {\n Args: {\n controller: SayController;\n node: ResolvedPNode | undefined;\n expanded?: boolean;\n onToggle?: (expanded: boolean) => void;\n };\n};\nexport type AttributeEditHandler = (\n pos: number,\n value: string,\n) => TransactionMonad<boolean>;\n\nexport default class AttributeEditor extends Component<Signature> {\n @localCopy('args.expanded', true) declare expanded: boolean;\n @tracked isEditing = false;\n\n get node() {\n return this.args.node;\n }\n get nodeAttrs() {\n return this.node?.value.attrs ?? {};\n }\n get nodespec() {\n return this.node?.value.type.spec as SayNodeSpec;\n }\n\n toggleSection = () => {\n this.expanded = !this.expanded;\n this.args.onToggle?.(this.expanded);\n };\n\n isEditable = (attr: string): boolean | undefined => {\n return this.nodespec.attrs?.[attr].editable;\n };\n\n setAttrMonad =\n (key: string) =>\n (pos: number, value: string): TransactionMonad<boolean> =>\n (state) => {\n const tr = state.tr;\n TransformUtils.setAttribute(tr, pos, key, value);\n return { transaction: tr, initialState: state, result: true };\n };\n\n getHandler = (attr: string): AttributeEditHandler | null => {\n if (this.isEditable(attr)) {\n //@ts-expect-error handler is not defined on attribute-spec type\n const handler = this.node.value.type.spec.attrs[attr].editHandler as\n | AttributeEditHandler\n | undefined;\n if (handler) {\n return handler;\n } else {\n return this.setAttrMonad(attr);\n }\n }\n return null;\n };\n\n enableEditingMode = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.isEditing = true;\n };\n cancelEditing = (formReset: () => void, event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.isEditing = false;\n formReset();\n };\n\n setField = (\n field: HeadlessFormFieldComponentSignature<Attrs>['Blocks']['default'][0],\n value: Event,\n ) => {\n const newVal = (value.target as HTMLTextAreaElement).value;\n field.setValue(newVal);\n };\n\n saveChanges = (newAttrs: FormData<Attrs>) => {\n this.args.controller?.withTransaction(() => {\n const monads: TransactionMonad<boolean>[] = [];\n for (const key in newAttrs) {\n if (newAttrs[key] !== this.nodeAttrs[key]) {\n const handler = this.getHandler(key);\n if (handler && this.node) {\n monads.push(handler(this.node.pos, newAttrs[key] as string));\n }\n }\n }\n return transactionCombinator(this.args.controller.mainEditorState)(monads)\n .transaction;\n });\n this.isEditing = false;\n };\n\n formatValue = (value: unknown) => {\n return JSON.stringify(value, null, 2);\n };\n\n editorComponent = (attr: string) => {\n return this.nodespec?.attrs?.[attr].editor;\n };\n\n <template>\n <WithUniqueId as |formId|>\n <HeadlessForm\n id={{formId}}\n @data={{this.nodeAttrs}}\n @onSubmit={{this.saveChanges}}\n as |form|\n >\n <AuCard\n @size=\"small\"\n @expandable={{true}}\n @manualControl={{true}}\n @openSection={{this.toggleSection}}\n @isExpanded={{this.expanded}}\n @disableAuContent={{true}}\n as |c|\n >\n <c.header class=\"say-flex-grow\">\n <AuToolbar\n class=\"au-u-flex au-u-flex-row au-u-flex--space-between\"\n as |Group|\n >\n <Group>\n <AuHeading @level=\"1\" @skin=\"6\">Node attributes</AuHeading>\n </Group>\n <Group>\n <AuButtonGroup>\n {{#if this.isEditing}}\n <AuButton\n @skin=\"link-secondary\"\n @iconAlignment=\"right\"\n {{on \"click\" (fn this.cancelEditing form.reset)}}\n >\n Cancel\n </AuButton>\n <AuButton\n @skin=\"link\"\n type=\"submit\"\n @icon={{CheckIcon}}\n onclick=\"event.stopPropagation();\"\n @iconAlignment=\"right\"\n >\n Save\n </AuButton>\n {{else}}\n <AuButton\n @skin=\"link\"\n @icon={{PencilIcon}}\n @iconAlignment=\"right\"\n {{on \"click\" this.enableEditingMode}}\n >\n Edit\n </AuButton>\n {{/if}}\n </AuButtonGroup>\n </Group>\n </AuToolbar>\n\n </c.header>\n <c.content class=\"au-c-content--tiny\">\n\n <AuList @divider={{true}} as |Item|>\n {{#each-in this.nodeAttrs as |key value|}}\n <Item>\n <div class=\"au-u-padding-tiny\">\n {{#if (and this.isEditing (this.isEditable key))}}\n <form.Field @name={{key}} as |field|>\n <AuLabel for={{field.id}}>\n {{key}}\n </AuLabel>\n {{#let (this.editorComponent key) as |EditorComponent|}}\n {{#if EditorComponent}}\n {{! @glint-expect-error fix types of dynamic element }}\n <EditorComponent\n id={{field.id}}\n value={{field.value}}\n name={{key}}\n {{! @glint-expect-error glint has no Signature for the component}}\n {{on \"change\" (fn this.setField field)}}\n />\n {{else}}\n <AuTextarea\n @width=\"block\"\n id={{field.id}}\n value={{field.value}}\n name={{key}}\n {{on \"change\" (fn this.setField field)}}\n />\n {{/if}}\n {{/let}}\n </form.Field>\n {{else}}\n <p><strong>{{key}}</strong></p>\n <pre class=\"say-attribute-editor__formatted-content\">{{if\n value\n (this.formatValue value)\n \"<No value>\"\n }}</pre>\n {{/if}}\n </div>\n </Item>\n {{/each-in}}\n </AuList>\n </c.content>\n </AuCard>\n </HeadlessForm>\n </WithUniqueId>\n </template>\n}\n"],"names":["AttributeEditor","Component","g","prototype","localCopy","i","tracked","node","args","nodeAttrs","value","attrs","nodespec","type","spec","toggleSection","expanded","onToggle","isEditable","attr","editable","setAttrMonad","key","pos","state","tr","TransformUtils","setAttribute","transaction","initialState","result","getHandler","handler","editHandler","enableEditingMode","event","preventDefault","stopPropagation","isEditing","cancelEditing","formReset","setField","field","newVal","target","setValue","saveChanges","newAttrs","controller","withTransaction","monads","push","transactionCombinator","mainEditorState","formatValue","JSON","stringify","editorComponent","editor","setComponentTemplate","precompileTemplate","strictMode","scope","WithUniqueId","HeadlessForm","AuCard","AuToolbar","AuHeading","AuButtonGroup","AuButton","on","fn","CheckIcon","PencilIcon","AuList","and","AuLabel","AuTextarea"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/_private/attribute-editor/index.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { localCopy } from 'tracked-toolbox';\nimport { HeadlessForm, type FormData } from 'ember-headless-form';\nimport type { HeadlessFormFieldComponentSignature } from 'ember-headless-form/-private/components/field';\nimport { on } from '@ember/modifier';\nimport { fn } from '@ember/helper';\nimport { and } from 'ember-truth-helpers';\nimport type { Attrs } from 'prosemirror-model';\nimport { CheckIcon } from '@appuniversum/ember-appuniversum/components/icons/check';\nimport { PencilIcon } from '@appuniversum/ember-appuniversum/components/icons/pencil';\nimport AuButtonGroup from '@appuniversum/ember-appuniversum/components/au-button-group';\nimport AuToolbar from '@appuniversum/ember-appuniversum/components/au-toolbar';\nimport AuList from '@appuniversum/ember-appuniversum/components/au-list';\nimport AuLabel from '@appuniversum/ember-appuniversum/components/au-label';\nimport AuHeading from '@appuniversum/ember-appuniversum/components/au-heading';\nimport AuButton from '@appuniversum/ember-appuniversum/components/au-button';\nimport AuTextarea from '@appuniversum/ember-appuniversum/components/au-textarea';\nimport SayController from '#root/core/say-controller.ts';\nimport type SayNodeSpec from '#root/core/say-node-spec.ts';\nimport TransformUtils from '#root/utils/_private/transform-utils.ts';\nimport type { ResolvedPNode } from '#root/utils/_private/types.ts';\nimport {\n transactionCombinator,\n type TransactionMonad,\n} from '#root/utils/transaction-utils.ts';\nimport WithUniqueId from '#root/components/_private/utils/with-unique-id.ts';\nimport AuCard from '@appuniversum/ember-appuniversum/components/au-card';\n\ntype Signature = {\n Args: {\n controller: SayController;\n node: ResolvedPNode | undefined;\n expanded?: boolean;\n onToggle?: (expanded: boolean) => void;\n };\n};\nexport type AttributeEditHandler = (\n pos: number,\n value: string,\n) => TransactionMonad<boolean>;\n\nexport default class AttributeEditor extends Component<Signature> {\n @localCopy('args.expanded', true) declare expanded: boolean;\n @tracked isEditing = false;\n\n get node() {\n return this.args.node;\n }\n get nodeAttrs() {\n return this.node?.value.attrs ?? {};\n }\n get nodespec() {\n return this.node?.value.type.spec as SayNodeSpec;\n }\n\n toggleSection = () => {\n this.expanded = !this.expanded;\n this.args.onToggle?.(this.expanded);\n };\n\n isEditable = (attr: string): boolean | undefined => {\n return this.nodespec.attrs?.[attr].editable;\n };\n\n setAttrMonad =\n (key: string) =>\n (pos: number, value: string): TransactionMonad<boolean> =>\n (state) => {\n const tr = state.tr;\n TransformUtils.setAttribute(tr, pos, key, value);\n return { transaction: tr, initialState: state, result: true };\n };\n\n getHandler = (attr: string): AttributeEditHandler | null => {\n if (this.isEditable(attr)) {\n //@ts-expect-error handler is not defined on attribute-spec type\n const handler = this.node.value.type.spec.attrs[attr].editHandler as\n | AttributeEditHandler\n | undefined;\n if (handler) {\n return handler;\n } else {\n return this.setAttrMonad(attr);\n }\n }\n return null;\n };\n\n enableEditingMode = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.isEditing = true;\n };\n cancelEditing = (formReset: () => void, event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.isEditing = false;\n formReset();\n };\n\n setField = (\n field: HeadlessFormFieldComponentSignature<Attrs>['Blocks']['default'][0],\n value: Event,\n ) => {\n const newVal = (value.target as HTMLTextAreaElement).value;\n field.setValue(newVal);\n };\n\n saveChanges = (newAttrs: FormData<Attrs>) => {\n this.args.controller?.withTransaction(() => {\n const monads: TransactionMonad<boolean>[] = [];\n for (const key in newAttrs) {\n if (newAttrs[key] !== this.nodeAttrs[key]) {\n const handler = this.getHandler(key);\n if (handler && this.node) {\n monads.push(handler(this.node.pos, newAttrs[key] as string));\n }\n }\n }\n return transactionCombinator(this.args.controller.mainEditorState)(monads)\n .transaction;\n });\n this.isEditing = false;\n };\n\n formatValue = (value: unknown) => {\n return JSON.stringify(value, null, 2);\n };\n\n editorComponent = (attr: string) => {\n return this.nodespec?.attrs?.[attr].editor;\n };\n\n <template>\n <WithUniqueId as |formId|>\n <HeadlessForm\n id={{formId}}\n @data={{this.nodeAttrs}}\n @onSubmit={{this.saveChanges}}\n as |form|\n >\n <AuCard\n @size=\"small\"\n @expandable={{true}}\n @manualControl={{true}}\n @openSection={{this.toggleSection}}\n @isExpanded={{this.expanded}}\n @disableAuContent={{true}}\n as |c|\n >\n <c.header class=\"say-flex-grow\">\n <AuToolbar\n class=\"au-u-flex au-u-flex-row au-u-flex--space-between\"\n as |Group|\n >\n <Group>\n <AuHeading @level=\"1\" @skin=\"6\">Node attributes</AuHeading>\n </Group>\n <Group>\n <AuButtonGroup>\n {{#if this.isEditing}}\n <AuButton\n @skin=\"link-secondary\"\n @iconAlignment=\"right\"\n {{on \"click\" (fn this.cancelEditing form.reset)}}\n >\n Cancel\n </AuButton>\n <AuButton\n @skin=\"link\"\n type=\"submit\"\n @icon={{CheckIcon}}\n onclick=\"event.stopPropagation();\"\n @iconAlignment=\"right\"\n >\n Save\n </AuButton>\n {{else}}\n <AuButton\n @skin=\"link\"\n @icon={{PencilIcon}}\n @iconAlignment=\"right\"\n {{on \"click\" this.enableEditingMode}}\n >\n Edit\n </AuButton>\n {{/if}}\n </AuButtonGroup>\n </Group>\n </AuToolbar>\n\n </c.header>\n <c.content class=\"au-c-content--tiny\">\n\n <AuList @divider={{true}} as |Item|>\n {{#each-in this.nodeAttrs as |key value|}}\n <Item>\n <div class=\"au-u-padding-tiny\">\n {{#if (and this.isEditing (this.isEditable key))}}\n <form.Field @name={{key}} as |field|>\n <AuLabel for={{field.id}}>\n {{key}}\n </AuLabel>\n {{#let (this.editorComponent key) as |EditorComponent|}}\n {{#if EditorComponent}}\n <EditorComponent\n {{! @glint-expect-error fix signature of dynamic `EditorComponent` }}\n id={{field.id}}\n value={{field.value}}\n name={{key}}\n {{on \"change\" (fn this.setField field)}}\n />\n {{else}}\n <AuTextarea\n @width=\"block\"\n id={{field.id}}\n value={{field.value}}\n name={{key}}\n {{on \"change\" (fn this.setField field)}}\n />\n {{/if}}\n {{/let}}\n </form.Field>\n {{else}}\n <p><strong>{{key}}</strong></p>\n <pre class=\"say-attribute-editor__formatted-content\">{{if\n value\n (this.formatValue value)\n \"<No value>\"\n }}</pre>\n {{/if}}\n </div>\n </Item>\n {{/each-in}}\n </AuList>\n </c.content>\n </AuCard>\n </HeadlessForm>\n </WithUniqueId>\n </template>\n}\n"],"names":["AttributeEditor","Component","g","prototype","localCopy","i","tracked","node","args","nodeAttrs","value","attrs","nodespec","type","spec","toggleSection","expanded","onToggle","isEditable","attr","editable","setAttrMonad","key","pos","state","tr","TransformUtils","setAttribute","transaction","initialState","result","getHandler","handler","editHandler","enableEditingMode","event","preventDefault","stopPropagation","isEditing","cancelEditing","formReset","setField","field","newVal","target","setValue","saveChanges","newAttrs","controller","withTransaction","monads","push","transactionCombinator","mainEditorState","formatValue","JSON","stringify","editorComponent","editor","setComponentTemplate","precompileTemplate","strictMode","scope","WithUniqueId","HeadlessForm","AuCard","AuToolbar","AuHeading","AuButtonGroup","AuButton","on","fn","CheckIcon","PencilIcon","AuList","and","AuLabel","AuTextarea"],"mappings":"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"}
@@ -8,7 +8,7 @@ import 'uuid';
8
8
  import '../../../utils/_private/constants.js';
9
9
  import 'relative-to-absolute-iri';
10
10
  import 'rdf-data-factory';
11
- import '../../../main-dUbkrxFL.js';
11
+ import '../../../main-DFf-0En3.js';
12
12
  import '../../../core/say-data-factory/data-factory.js';
13
13
  import '../../../core/say-data-factory/default-graph.js';
14
14
  import '../../../config/rdfa.js';
@@ -1 +1 @@
1
- {"version":3,"file":"configurable-rdfa-display.js","sources":["../../../../src/components/_private/common/configurable-rdfa-display.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { get } from '@ember/helper';\nimport type { ComponentLike } from '@glint/template';\nimport type { TemplateOnlyComponent } from '@ember/component/template-only';\nimport t from 'ember-intl/helpers/t';\nimport { trackedFunction } from 'reactiveweb/function';\nimport AuLoader from '@appuniversum/ember-appuniversum/components/au-loader';\nimport AuPill from '@appuniversum/ember-appuniversum/components/au-pill';\nimport { type OutgoingTriple } from '#root/core/rdfa-processor.ts';\nimport {\n type DisplayElement,\n type DisplayGenerator,\n type DisplayMeta,\n type GeneratorContext,\n} from '#root/plugins/rdfa-info/types.ts';\n\ninterface SpanSig {\n Blocks: {\n default: [];\n };\n Element: HTMLSpanElement;\n}\nconst Span: TemplateOnlyComponent<SpanSig> = <template>\n <span ...attributes>{{yield}}</span>\n</template>;\n\nexport const predicateDisplay: DisplayGenerator<OutgoingTriple> = (triple) => {\n return [{ strong: 'predicate:' }, triple.predicate];\n};\n\ninterface Sig<T> {\n Args: {\n context: GeneratorContext;\n value: T;\n generator: DisplayGenerator<T>;\n wrapper?: ComponentLike<SpanSig>;\n };\n Blocks: {\n default: [];\n };\n}\n\nexport default class ConfigurableRdfaDisplay<T> extends Component<Sig<T>> {\n elementConfig = trackedFunction(this, () => {\n return this.args.generator(this.args.value, this.args.context);\n });\n get elements(): DisplayElement[] {\n const conf = this.elementConfig.value;\n if (!conf) return [];\n return 'elements' in conf ? conf.elements : conf;\n }\n get meta(): DisplayMeta {\n const conf = this.elementConfig.value;\n if (!conf) return {};\n return 'meta' in conf ? conf.meta : {};\n }\n get isHidden(): boolean {\n return this.elements.some(\n (element) => typeof element !== 'string' && 'hidden' in element,\n );\n }\n get wrapperComponent() {\n return this.args.wrapper ?? Span;\n }\n\n <template>\n {{#unless this.isHidden}}\n {{#let this.wrapperComponent as |Wrapper|}}\n <Wrapper title={{this.meta.title}}>\n {{#if this.elementConfig.isLoading}}\n <AuLoader @hideMessage={{true}}>\n {{t \"ember-rdfa-editor.utils.loading\"}}\n </AuLoader>\n {{else}}\n {{#each this.elements as |element|}}\n {{#if (get element \"strong\")}}\n {{! @glint-expect-error}}\n <strong>{{element.strong}}</strong>\n {{else if (get element \"pill\")}}\n {{! @glint-expect-error}}\n <AuPill @size=\"small\">{{element.pill}}</AuPill>\n {{else}}\n {{! @glint-expect-error}}\n {{element}}\n {{/if}}\n {{/each}}\n {{/if}}\n {{yield}}\n </Wrapper>\n {{/let}}\n {{/unless}}\n </template>\n}\n"],"names":["Span","setComponentTemplate","precompileTemplate","strictMode","templateOnly","predicateDisplay","triple","strong","predicate","ConfigurableRdfaDisplay","Component","elementConfig","trackedFunction","args","generator","value","context","elements","conf","meta","isHidden","some","element","wrapperComponent","wrapper","scope","AuLoader","t","get","AuPill"],"mappings":";;;;;;;;;;;;;;;;;;;AAsBA,MAAMA,IAA4B,GAAAC,oBAAA,CAAWC,kBAAA,CAAA,4CAAA,EAE7C;EAAAC,UAAA,EAAA;AAAU,CAAA,CAAA,EAAAC,YAAA,EAAA,CAAA;AAEH,MAAMC,gBAAmC,GAAmBC,MAAA,IAAA;AACjE,EAAA,OAAO,CAAC;AAAEC,IAAAA,MAAA,EAAQ;AAAa,GAAA,EAAGD,MAAA,CAAOE,SAAS,CAAC;AACrD;AAce,MAAMC,uBAAA,SAAmCC,SAAA,CAAc;AACpEC,EAAAA,aAAA,GAAgBC,eAAA,CAAgB,IAAI,EAAE,MAAA;AACpC,IAAA,OAAO,IAAI,CAACC,IAAI,CAACC,SAAS,CAAC,IAAI,CAACD,IAAI,CAACE,KAAK,EAAE,IAAI,CAACF,IAAI,CAACG,OAAO,CAAA;AAC/D,EAAA,CAAA,CAAA;EACA,IAAIC,WAA6B;AAC/B,IAAA,MAAMC,IAAA,GAAO,IAAI,CAACP,aAAa,CAACI,KAAK;AACrC,IAAA,IAAI,CAACG,IAAA,EAAM,OAAO,EAAE;IACpB,OAAO,UAAA,IAAcA,IAAA,GAAOA,IAAA,CAAKD,QAAQ,GAAGC,IAAA;AAC9C,EAAA;EACA,IAAIC,OAAoB;AACtB,IAAA,MAAMD,IAAA,GAAO,IAAI,CAACP,aAAa,CAACI,KAAK;AACrC,IAAA,IAAI,CAACG,IAAA,EAAM,OAAO,EAAC;IACnB,OAAO,MAAA,IAAUA,IAAA,GAAOA,IAAA,CAAKC,IAAI,GAAG,EAAC;AACvC,EAAA;EACA,IAAIC,QAAAA,GAAoB;AACtB,IAAA,OAAO,IAAI,CAACH,QAAQ,CAACI,IAAI,CACtBC,OAAA,IAAY,OAAOA,OAAA,KAAY,QAAA,IAAY,QAAA,IAAYA,OAAA,CAAA;AAE5D,EAAA;EACA,IAAIC,gBAAAA,GAAmB;AACrB,IAAA,OAAO,IAAI,CAACV,IAAI,CAACW,OAAO,IAAIxB,IAAA;AAC9B,EAAA;AAEA,EAAA;IAAAC,oBAAA,CAAAC,kBAAA,CAAA,k6BAAA,EA0BA;MAAAC,UAAA,EAAA,IAAA;AAAAsB,MAAAA,KAAA,EAAAA,OAAA;QAAAC,QAAA;QAAAC,CAAA;QAAAC,GAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"}
1
+ {"version":3,"file":"configurable-rdfa-display.js","sources":["../../../../src/components/_private/common/configurable-rdfa-display.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { get } from '@ember/helper';\nimport type { ComponentLike } from '@glint/template';\nimport type { TemplateOnlyComponent } from '@ember/component/template-only';\nimport t from 'ember-intl/helpers/t';\nimport { trackedFunction } from 'reactiveweb/function';\nimport AuLoader from '@appuniversum/ember-appuniversum/components/au-loader';\nimport AuPill from '@appuniversum/ember-appuniversum/components/au-pill';\nimport { type OutgoingTriple } from '#root/core/rdfa-processor.ts';\nimport {\n type DisplayElement,\n type DisplayGenerator,\n type DisplayMeta,\n type GeneratorContext,\n} from '#root/plugins/rdfa-info/types.ts';\n\ninterface HTMLElementSig {\n Blocks: {\n default: [];\n };\n Element: HTMLElement;\n}\nconst Span: TemplateOnlyComponent<HTMLElementSig> = <template>\n <span ...attributes>{{yield}}</span>\n</template>;\n\nexport const predicateDisplay: DisplayGenerator<OutgoingTriple> = (triple) => {\n return [{ strong: 'predicate:' }, triple.predicate];\n};\n\ninterface Sig<T> {\n Args: {\n context: GeneratorContext;\n value: T;\n generator: DisplayGenerator<T>;\n wrapper?: ComponentLike<HTMLElementSig>;\n };\n Blocks: {\n default: [];\n };\n}\n\nexport default class ConfigurableRdfaDisplay<T> extends Component<Sig<T>> {\n elementConfig = trackedFunction(this, () => {\n return this.args.generator(this.args.value, this.args.context);\n });\n get elements(): DisplayElement[] {\n const conf = this.elementConfig.value;\n if (!conf) return [];\n return 'elements' in conf ? conf.elements : conf;\n }\n get meta(): DisplayMeta {\n const conf = this.elementConfig.value;\n if (!conf) return {};\n return 'meta' in conf ? conf.meta : {};\n }\n get isHidden(): boolean {\n return this.elements.some(\n (element) => typeof element !== 'string' && 'hidden' in element,\n );\n }\n get wrapperComponent() {\n return this.args.wrapper ?? Span;\n }\n\n <template>\n {{#unless this.isHidden}}\n {{#let this.wrapperComponent as |Wrapper|}}\n <Wrapper title={{this.meta.title}}>\n {{#if this.elementConfig.isLoading}}\n <AuLoader @hideMessage={{true}}>\n {{t \"ember-rdfa-editor.utils.loading\"}}\n </AuLoader>\n {{else}}\n {{#each this.elements as |element|}}\n {{#if (get element \"strong\")}}\n {{! @glint-expect-error}}\n <strong>{{element.strong}}</strong>\n {{else if (get element \"pill\")}}\n {{! @glint-expect-error}}\n <AuPill @size=\"small\">{{element.pill}}</AuPill>\n {{else}}\n {{! @glint-expect-error}}\n {{element}}\n {{/if}}\n {{/each}}\n {{/if}}\n {{yield}}\n </Wrapper>\n {{/let}}\n {{/unless}}\n </template>\n}\n"],"names":["Span","setComponentTemplate","precompileTemplate","strictMode","templateOnly","predicateDisplay","triple","strong","predicate","ConfigurableRdfaDisplay","Component","elementConfig","trackedFunction","args","generator","value","context","elements","conf","meta","isHidden","some","element","wrapperComponent","wrapper","scope","AuLoader","t","get","AuPill"],"mappings":";;;;;;;;;;;;;;;;;;;AAsBA,MAAMA,IAA4B,GAAAC,oBAAA,CAAkBC,kBAAA,CAAA,4CAAA,EAEpD;EAAAC,UAAA,EAAA;AAAU,CAAA,CAAA,EAAAC,YAAA,EAAA,CAAA;AAEH,MAAMC,gBAAmC,GAAmBC,MAAA,IAAA;AACjE,EAAA,OAAO,CAAC;AAAEC,IAAAA,MAAA,EAAQ;AAAa,GAAA,EAAGD,MAAA,CAAOE,SAAS,CAAC;AACrD;AAce,MAAMC,uBAAA,SAAmCC,SAAA,CAAc;AACpEC,EAAAA,aAAA,GAAgBC,eAAA,CAAgB,IAAI,EAAE,MAAA;AACpC,IAAA,OAAO,IAAI,CAACC,IAAI,CAACC,SAAS,CAAC,IAAI,CAACD,IAAI,CAACE,KAAK,EAAE,IAAI,CAACF,IAAI,CAACG,OAAO,CAAA;AAC/D,EAAA,CAAA,CAAA;EACA,IAAIC,WAA6B;AAC/B,IAAA,MAAMC,IAAA,GAAO,IAAI,CAACP,aAAa,CAACI,KAAK;AACrC,IAAA,IAAI,CAACG,IAAA,EAAM,OAAO,EAAE;IACpB,OAAO,UAAA,IAAcA,IAAA,GAAOA,IAAA,CAAKD,QAAQ,GAAGC,IAAA;AAC9C,EAAA;EACA,IAAIC,OAAoB;AACtB,IAAA,MAAMD,IAAA,GAAO,IAAI,CAACP,aAAa,CAACI,KAAK;AACrC,IAAA,IAAI,CAACG,IAAA,EAAM,OAAO,EAAC;IACnB,OAAO,MAAA,IAAUA,IAAA,GAAOA,IAAA,CAAKC,IAAI,GAAG,EAAC;AACvC,EAAA;EACA,IAAIC,QAAAA,GAAoB;AACtB,IAAA,OAAO,IAAI,CAACH,QAAQ,CAACI,IAAI,CACtBC,OAAA,IAAY,OAAOA,OAAA,KAAY,QAAA,IAAY,QAAA,IAAYA,OAAA,CAAA;AAE5D,EAAA;EACA,IAAIC,gBAAAA,GAAmB;AACrB,IAAA,OAAO,IAAI,CAACV,IAAI,CAACW,OAAO,IAAIxB,IAAA;AAC9B,EAAA;AAEA,EAAA;IAAAC,oBAAA,CAAAC,kBAAA,CAAA,k6BAAA,EA0BA;MAAAC,UAAA,EAAA,IAAA;AAAAsB,MAAAA,KAAA,EAAAA,OAAA;QAAAC,QAAA;QAAAC,CAAA;QAAAC,GAAA;AAAAC,QAAAA;AAAA,OAAA;KAAU,CAAA,EAAV,IAAW,CAAA;AAAD;AACZ;;;;"}
@@ -11,7 +11,7 @@ import 'uuid';
11
11
  import '../../../utils/_private/constants.js';
12
12
  import 'relative-to-absolute-iri';
13
13
  import 'rdf-data-factory';
14
- import '../../../main-dUbkrxFL.js';
14
+ import '../../../main-DFf-0En3.js';
15
15
  import '../../../core/say-data-factory/data-factory.js';
16
16
  import '../../../core/say-data-factory/default-graph.js';
17
17
  import '../../../config/rdfa.js';
@@ -10,7 +10,7 @@ import '../../../utils/_private/constants.js';
10
10
  import 'uuid';
11
11
  import 'relative-to-absolute-iri';
12
12
  import 'rdf-data-factory';
13
- import '../../../main-dUbkrxFL.js';
13
+ import '../../../main-DFf-0En3.js';
14
14
  import '../../../config/rdfa.js';
15
15
  import 'iter-tools';
16
16
  import { wrapResource } from '../../../commands/_private/rdfa-commands/wrap-resource.js';
@@ -184,7 +184,7 @@ class Modal extends Component {
184
184
  return this.generateNewUri === 'yes';
185
185
  }
186
186
  static {
187
- setComponentTemplate(precompileTemplate("\n <WithUniqueId as |formId|>\n <AuModal @modalOpen={{@modalOpen}} @closable={{true}} @closeModal={{@closeModal}} {{!-- @glint-expect-error appuniversum types should be adapted to accept an html element here --}} @initialFocus={{this.initiallyFocusedElement}}>\n <:title>Wrap selection</:title>\n <:body>\n <form class=\"au-c-form\" id={{formId}} {{on \"submit\" this.save}} {{this.setupFormSubmitShortcut}}>\n <AuFormRow>\n <WithUniqueId as |id|>\n <AuLabel for={{id}} @required={{true}} @requiredLabel=\"Required\">\n Generate new URI?\n </AuLabel>\n <AuRadioGroup id={{id}} required={{true}} @name=\"isNew\" @selected={{this.generateNewUri}} @onChange={{this.shouldGenerateNewUri}} @alignment=\"inline\" as |Group|>\n <Group.Radio @value=\"yes\">Yes</Group.Radio>\n <Group.Radio @value=\"no\">No</Group.Radio>\n </AuRadioGroup>\n </WithUniqueId>\n </AuFormRow>\n <AuFormRow>\n <WithUniqueId as |id|>\n <AuLabel for={{id}} @required={{true}} @requiredLabel=\"Required\">\n {{#if this.isNewUri}}URI base{{else}}Existing URI{{/if}}\n </AuLabel>\n <AuInput {{this.initialFocus}} id={{id}} required={{true}} value={{this.resourceUriBase}} @width=\"block\" placeholder=\"http://example.com/resource/\" {{on \"input\" this.updateUriBase}} />\n </WithUniqueId>\n </AuFormRow>\n </form>\n </:body>\n <:footer>\n <AuButtonGroup>\n <AuButton form={{formId}} type=\"submit\" @disabled={{not this.canSave}}>\n Save\n </AuButton>\n <AuButton @skin=\"secondary\" {{on \"click\" @closeModal}}>Cancel</AuButton>\n </AuButtonGroup>\n </:footer>\n </AuModal>\n </WithUniqueId>\n ", {
187
+ setComponentTemplate(precompileTemplate("\n <WithUniqueId as |formId|>\n <AuModal @modalOpen={{@modalOpen}} @closable={{true}} @closeModal={{@closeModal}} {{!-- @glint-expect-error appuniversum types should be adapted to accept an html element here --}} @initialFocus={{this.initiallyFocusedElement}}>\n <:title>Wrap selection</:title>\n <:body>\n <form class=\"au-c-form\" id={{formId}} {{on \"submit\" this.save}} {{this.setupFormSubmitShortcut}}>\n <AuFormRow>\n <WithUniqueId as |id|>\n <AuLabel for={{id}} @required={{true}} @requiredLabel=\"Required\">\n Generate new URI?\n </AuLabel>\n <AuRadioGroup id={{id}} {{!-- @glint-expect-error fix `AuRadioGroup` signature --}} required={{true}} @name=\"isNew\" @selected={{this.generateNewUri}} @onChange={{this.shouldGenerateNewUri}} @alignment=\"inline\" as |Group|>\n <Group.Radio @value=\"yes\">Yes</Group.Radio>\n <Group.Radio @value=\"no\">No</Group.Radio>\n </AuRadioGroup>\n </WithUniqueId>\n </AuFormRow>\n <AuFormRow>\n <WithUniqueId as |id|>\n <AuLabel for={{id}} @required={{true}} @requiredLabel=\"Required\">\n {{#if this.isNewUri}}URI base{{else}}Existing URI{{/if}}\n </AuLabel>\n <AuInput {{this.initialFocus}} id={{id}} required={{true}} value={{this.resourceUriBase}} @width=\"block\" placeholder=\"http://example.com/resource/\" {{on \"input\" this.updateUriBase}} />\n </WithUniqueId>\n </AuFormRow>\n </form>\n </:body>\n <:footer>\n <AuButtonGroup>\n <AuButton form={{formId}} type=\"submit\" @disabled={{not this.canSave}}>\n Save\n </AuButton>\n <AuButton @skin=\"secondary\" {{on \"click\" @closeModal}}>Cancel</AuButton>\n </AuButtonGroup>\n </:footer>\n </AuModal>\n </WithUniqueId>\n ", {
188
188
  strictMode: true,
189
189
  scope: () => ({
190
190
  WithUniqueId: WithUniqueIdComponent,
@@ -1 +1 @@
1
- {"version":3,"file":"wrapping-utils.js","sources":["../../../../src/components/_private/node-controls/wrapping-utils.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport {\n wrapInlineResource,\n wrapLiteral,\n wrapResource,\n} from '#root/commands/_private/rdfa-commands/index.ts';\nimport { wrapInlineLiteral } from '#root/commands/_private/rdfa-commands/wrap-inline-literal.ts';\nimport { PlusIcon } from '@appuniversum/ember-appuniversum/components/icons/plus';\nimport type SayController from '#root/core/say-controller.ts';\nimport AuContent from '@appuniversum/ember-appuniversum/components/au-content';\nimport AuToolbar from '@appuniversum/ember-appuniversum/components/au-toolbar';\nimport AuButton from '@appuniversum/ember-appuniversum/components/au-button';\nimport { on } from '@ember/modifier';\nimport { fn } from '@ember/helper';\nimport { not } from 'ember-truth-helpers';\nimport { modifier } from 'ember-modifier';\nimport AuModal from '@appuniversum/ember-appuniversum/components/au-modal';\nimport AuFormRow from '@appuniversum/ember-appuniversum/components/au-form-row';\nimport AuLabel from '@appuniversum/ember-appuniversum/components/au-label';\nimport AuInput from '@appuniversum/ember-appuniversum/components/au-input';\nimport AuButtonGroup from '@appuniversum/ember-appuniversum/components/au-button-group';\nimport AuRadioGroup from '@appuniversum/ember-appuniversum/components/au-radio-group';\nimport WithUniqueId from '#root/components/_private/utils/with-unique-id.ts';\n\ntype WrappingUtilsArgs = {\n controller?: SayController;\n};\n\nexport default class WrappingUtils extends Component<WrappingUtilsArgs> {\n @tracked modalOpen = false;\n @tracked wrapWithResource;\n\n constructor(owner: unknown, args: WrappingUtilsArgs) {\n super(owner, args);\n this.wrapWithResource = this.wrapWithBlockResource;\n }\n\n setUpListeners = modifier(() => {\n const listenerHandler = (event: KeyboardEvent) => {\n if (event.altKey && event.ctrlKey) {\n const key = event.key;\n switch (key) {\n case 'r':\n // Wrap with block resource\n this.openModal(false);\n break;\n case 'R':\n // Wrap with inline resource\n this.openModal(true);\n break;\n case 'l':\n // Wrap with block literal\n this.wrapWithLiteralNode();\n break;\n case 'L':\n // Wrap with inline literal\n this.wrapWithInlineLiteralNode();\n break;\n }\n }\n };\n window.addEventListener('keydown', listenerHandler);\n return () => {\n window.removeEventListener('keydown', listenerHandler);\n };\n });\n\n openModal = (inline: boolean) => {\n if (inline) {\n this.wrapWithResource = this.wrapWithInlineResource;\n } else {\n this.wrapWithResource = this.wrapWithBlockResource;\n }\n this.modalOpen = true;\n };\n\n closeModal = () => {\n this.modalOpen = false;\n };\n\n get controller() {\n return this.args.controller;\n }\n\n get canWrapWithLiteral() {\n return this.controller?.checkCommand(wrapLiteral());\n }\n get canWrapWithInlineLiteral() {\n return this.controller?.checkCommand(wrapInlineLiteral());\n }\n wrapWithLiteralNode = () => {\n this.controller?.doCommand(wrapLiteral());\n };\n\n wrapWithBlockResource = (details: Parameters<typeof wrapResource>[0]) => {\n this.controller?.doCommand(wrapResource(details));\n this.closeModal();\n };\n wrapWithInlineLiteralNode = () => {\n this.controller?.doCommand(wrapInlineLiteral());\n };\n wrapWithInlineResource = (details: Parameters<typeof wrapResource>[0]) => {\n this.controller?.doCommand(wrapInlineResource(details));\n this.closeModal();\n };\n\n <template>\n <AuContent @skin=\"tiny\" {{this.setUpListeners}}>\n <AuToolbar as |Group|>\n <Group>\n <AuButton\n @icon={{PlusIcon}}\n @skin=\"naked\"\n {{on \"click\" (fn this.openModal false)}}\n >\n Wrap With Block Resource\n </AuButton>\n </Group>\n <Group>\n <AuButton\n @icon={{PlusIcon}}\n @skin=\"naked\"\n @disabled={{not this.canWrapWithLiteral}}\n {{on \"click\" this.wrapWithLiteralNode}}\n >\n Wrap With Block Literal\n </AuButton>\n </Group>\n\n <Group>\n <AuButton\n @icon={{PlusIcon}}\n @skin=\"naked\"\n {{on \"click\" (fn this.openModal true)}}\n >\n Wrap With Inline Resource\n </AuButton>\n </Group>\n <Group>\n <AuButton\n @icon={{PlusIcon}}\n @skin=\"naked\"\n @disabled={{not this.canWrapWithInlineLiteral}}\n {{on \"click\" this.wrapWithInlineLiteralNode}}\n >\n Wrap With Inline Literal\n </AuButton>\n </Group>\n </AuToolbar>\n </AuContent>\n\n <Modal\n @modalOpen={{this.modalOpen}}\n @closeModal={{this.closeModal}}\n @wrapWithResource={{this.wrapWithResource}}\n />\n </template>\n}\n\ntype ModalArgs = {\n closeModal: () => void;\n modalOpen: boolean;\n wrapWithResource: WrappingUtils['wrapWithResource'];\n};\n\nclass Modal extends Component<ModalArgs> {\n @tracked initiallyFocusedElement?: HTMLElement;\n\n setupFormSubmitShortcut = modifier((formElement: HTMLFormElement) => {\n const ctrlEnterHandler = (event: KeyboardEvent) => {\n if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {\n formElement.requestSubmit();\n }\n };\n window.addEventListener('keydown', ctrlEnterHandler);\n return () => window.removeEventListener('keydown', ctrlEnterHandler);\n });\n\n initialFocus = modifier((element: HTMLElement) => {\n this.initiallyFocusedElement = element;\n });\n\n @tracked generateNewUri = 'yes';\n @tracked resourceUriBase = '';\n\n updateUriBase = (event: InputEvent) => {\n this.resourceUriBase = (event.target as HTMLInputElement).value;\n };\n shouldGenerateNewUri = (value: 'yes' | 'no') => {\n this.generateNewUri = value;\n };\n\n save = (event: Event) => {\n event.preventDefault();\n if (this.isNewUri) {\n this.args.wrapWithResource({ uriBase: this.resourceUriBase });\n } else {\n this.args.wrapWithResource({ existingUri: this.resourceUriBase });\n }\n };\n\n get canSave() {\n return !!this.resourceUriBase;\n }\n get isNewUri() {\n return this.generateNewUri === 'yes';\n }\n\n <template>\n <WithUniqueId as |formId|>\n <AuModal\n @modalOpen={{@modalOpen}}\n @closable={{true}}\n @closeModal={{@closeModal}}\n {{! @glint-expect-error appuniversum types should be adapted to accept an html element here }}\n @initialFocus={{this.initiallyFocusedElement}}\n >\n <:title>Wrap selection</:title>\n <:body>\n <form\n class=\"au-c-form\"\n id={{formId}}\n {{on \"submit\" this.save}}\n {{this.setupFormSubmitShortcut}}\n >\n <AuFormRow>\n <WithUniqueId as |id|>\n <AuLabel\n for={{id}}\n @required={{true}}\n @requiredLabel=\"Required\"\n >\n Generate new URI?\n </AuLabel>\n <AuRadioGroup\n id={{id}}\n required={{true}}\n @name=\"isNew\"\n @selected={{this.generateNewUri}}\n @onChange={{this.shouldGenerateNewUri}}\n @alignment=\"inline\"\n as |Group|\n >\n <Group.Radio @value=\"yes\">Yes</Group.Radio>\n <Group.Radio @value=\"no\">No</Group.Radio>\n </AuRadioGroup>\n </WithUniqueId>\n </AuFormRow>\n <AuFormRow>\n <WithUniqueId as |id|>\n <AuLabel\n for={{id}}\n @required={{true}}\n @requiredLabel=\"Required\"\n >\n {{#if this.isNewUri}}URI base{{else}}Existing URI{{/if}}\n </AuLabel>\n <AuInput\n {{this.initialFocus}}\n id={{id}}\n required={{true}}\n value={{this.resourceUriBase}}\n @width=\"block\"\n placeholder=\"http://example.com/resource/\"\n {{on \"input\" this.updateUriBase}}\n />\n </WithUniqueId>\n </AuFormRow>\n </form>\n </:body>\n <:footer>\n <AuButtonGroup>\n <AuButton\n form={{formId}}\n type=\"submit\"\n @disabled={{not this.canSave}}\n >\n Save\n </AuButton>\n <AuButton\n @skin=\"secondary\"\n {{on \"click\" @closeModal}}\n >Cancel</AuButton>\n </AuButtonGroup>\n </:footer>\n </AuModal>\n </WithUniqueId>\n </template>\n}\n"],"names":["WrappingUtils","Component","g","prototype","tracked","i","constructor","owner","args","wrapWithResource","wrapWithBlockResource","setUpListeners","modifier","listenerHandler","event","altKey","ctrlKey","key","openModal","wrapWithLiteralNode","wrapWithInlineLiteralNode","window","addEventListener","removeEventListener","inline","wrapWithInlineResource","modalOpen","closeModal","controller","canWrapWithLiteral","checkCommand","wrapLiteral","canWrapWithInlineLiteral","wrapInlineLiteral","doCommand","details","wrapResource","wrapInlineResource","setComponentTemplate","precompileTemplate","strictMode","scope","AuContent","AuToolbar","AuButton","PlusIcon","on","fn","not","Modal","setupFormSubmitShortcut","formElement","ctrlEnterHandler","metaKey","requestSubmit","initialFocus","element","initiallyFocusedElement","updateUriBase","resourceUriBase","target","value","shouldGenerateNewUri","generateNewUri","save","preventDefault","isNewUri","uriBase","existingUri","canSave","WithUniqueId","AuModal","AuFormRow","AuLabel","AuRadioGroup","AuInput","AuButtonGroup"],"mappings":"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"}
1
+ {"version":3,"file":"wrapping-utils.js","sources":["../../../../src/components/_private/node-controls/wrapping-utils.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport {\n wrapInlineResource,\n wrapLiteral,\n wrapResource,\n} from '#root/commands/_private/rdfa-commands/index.ts';\nimport { wrapInlineLiteral } from '#root/commands/_private/rdfa-commands/wrap-inline-literal.ts';\nimport { PlusIcon } from '@appuniversum/ember-appuniversum/components/icons/plus';\nimport type SayController from '#root/core/say-controller.ts';\nimport AuContent from '@appuniversum/ember-appuniversum/components/au-content';\nimport AuToolbar from '@appuniversum/ember-appuniversum/components/au-toolbar';\nimport AuButton from '@appuniversum/ember-appuniversum/components/au-button';\nimport { on } from '@ember/modifier';\nimport { fn } from '@ember/helper';\nimport { not } from 'ember-truth-helpers';\nimport { modifier } from 'ember-modifier';\nimport AuModal from '@appuniversum/ember-appuniversum/components/au-modal';\nimport AuFormRow from '@appuniversum/ember-appuniversum/components/au-form-row';\nimport AuLabel from '@appuniversum/ember-appuniversum/components/au-label';\nimport AuInput from '@appuniversum/ember-appuniversum/components/au-input';\nimport AuButtonGroup from '@appuniversum/ember-appuniversum/components/au-button-group';\nimport AuRadioGroup from '@appuniversum/ember-appuniversum/components/au-radio-group';\nimport WithUniqueId from '#root/components/_private/utils/with-unique-id.ts';\n\ntype WrappingUtilsArgs = {\n controller?: SayController;\n};\n\nexport default class WrappingUtils extends Component<WrappingUtilsArgs> {\n @tracked modalOpen = false;\n @tracked wrapWithResource;\n\n constructor(owner: unknown, args: WrappingUtilsArgs) {\n super(owner, args);\n this.wrapWithResource = this.wrapWithBlockResource;\n }\n\n setUpListeners = modifier(() => {\n const listenerHandler = (event: KeyboardEvent) => {\n if (event.altKey && event.ctrlKey) {\n const key = event.key;\n switch (key) {\n case 'r':\n // Wrap with block resource\n this.openModal(false);\n break;\n case 'R':\n // Wrap with inline resource\n this.openModal(true);\n break;\n case 'l':\n // Wrap with block literal\n this.wrapWithLiteralNode();\n break;\n case 'L':\n // Wrap with inline literal\n this.wrapWithInlineLiteralNode();\n break;\n }\n }\n };\n window.addEventListener('keydown', listenerHandler);\n return () => {\n window.removeEventListener('keydown', listenerHandler);\n };\n });\n\n openModal = (inline: boolean) => {\n if (inline) {\n this.wrapWithResource = this.wrapWithInlineResource;\n } else {\n this.wrapWithResource = this.wrapWithBlockResource;\n }\n this.modalOpen = true;\n };\n\n closeModal = () => {\n this.modalOpen = false;\n };\n\n get controller() {\n return this.args.controller;\n }\n\n get canWrapWithLiteral() {\n return this.controller?.checkCommand(wrapLiteral());\n }\n get canWrapWithInlineLiteral() {\n return this.controller?.checkCommand(wrapInlineLiteral());\n }\n wrapWithLiteralNode = () => {\n this.controller?.doCommand(wrapLiteral());\n };\n\n wrapWithBlockResource = (details: Parameters<typeof wrapResource>[0]) => {\n this.controller?.doCommand(wrapResource(details));\n this.closeModal();\n };\n wrapWithInlineLiteralNode = () => {\n this.controller?.doCommand(wrapInlineLiteral());\n };\n wrapWithInlineResource = (details: Parameters<typeof wrapResource>[0]) => {\n this.controller?.doCommand(wrapInlineResource(details));\n this.closeModal();\n };\n\n <template>\n <AuContent @skin=\"tiny\" {{this.setUpListeners}}>\n <AuToolbar as |Group|>\n <Group>\n <AuButton\n @icon={{PlusIcon}}\n @skin=\"naked\"\n {{on \"click\" (fn this.openModal false)}}\n >\n Wrap With Block Resource\n </AuButton>\n </Group>\n <Group>\n <AuButton\n @icon={{PlusIcon}}\n @skin=\"naked\"\n @disabled={{not this.canWrapWithLiteral}}\n {{on \"click\" this.wrapWithLiteralNode}}\n >\n Wrap With Block Literal\n </AuButton>\n </Group>\n\n <Group>\n <AuButton\n @icon={{PlusIcon}}\n @skin=\"naked\"\n {{on \"click\" (fn this.openModal true)}}\n >\n Wrap With Inline Resource\n </AuButton>\n </Group>\n <Group>\n <AuButton\n @icon={{PlusIcon}}\n @skin=\"naked\"\n @disabled={{not this.canWrapWithInlineLiteral}}\n {{on \"click\" this.wrapWithInlineLiteralNode}}\n >\n Wrap With Inline Literal\n </AuButton>\n </Group>\n </AuToolbar>\n </AuContent>\n\n <Modal\n @modalOpen={{this.modalOpen}}\n @closeModal={{this.closeModal}}\n @wrapWithResource={{this.wrapWithResource}}\n />\n </template>\n}\n\ntype ModalArgs = {\n closeModal: () => void;\n modalOpen: boolean;\n wrapWithResource: WrappingUtils['wrapWithResource'];\n};\n\nclass Modal extends Component<ModalArgs> {\n @tracked initiallyFocusedElement?: HTMLElement;\n\n setupFormSubmitShortcut = modifier((formElement: HTMLFormElement) => {\n const ctrlEnterHandler = (event: KeyboardEvent) => {\n if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {\n formElement.requestSubmit();\n }\n };\n window.addEventListener('keydown', ctrlEnterHandler);\n return () => window.removeEventListener('keydown', ctrlEnterHandler);\n });\n\n initialFocus = modifier((element: HTMLElement) => {\n this.initiallyFocusedElement = element;\n });\n\n @tracked generateNewUri = 'yes';\n @tracked resourceUriBase = '';\n\n updateUriBase = (event: InputEvent) => {\n this.resourceUriBase = (event.target as HTMLInputElement).value;\n };\n shouldGenerateNewUri = (value: 'yes' | 'no') => {\n this.generateNewUri = value;\n };\n\n save = (event: Event) => {\n event.preventDefault();\n if (this.isNewUri) {\n this.args.wrapWithResource({ uriBase: this.resourceUriBase });\n } else {\n this.args.wrapWithResource({ existingUri: this.resourceUriBase });\n }\n };\n\n get canSave() {\n return !!this.resourceUriBase;\n }\n get isNewUri() {\n return this.generateNewUri === 'yes';\n }\n\n <template>\n <WithUniqueId as |formId|>\n <AuModal\n @modalOpen={{@modalOpen}}\n @closable={{true}}\n @closeModal={{@closeModal}}\n {{! @glint-expect-error appuniversum types should be adapted to accept an html element here }}\n @initialFocus={{this.initiallyFocusedElement}}\n >\n <:title>Wrap selection</:title>\n <:body>\n <form\n class=\"au-c-form\"\n id={{formId}}\n {{on \"submit\" this.save}}\n {{this.setupFormSubmitShortcut}}\n >\n <AuFormRow>\n <WithUniqueId as |id|>\n <AuLabel\n for={{id}}\n @required={{true}}\n @requiredLabel=\"Required\"\n >\n Generate new URI?\n </AuLabel>\n <AuRadioGroup\n id={{id}}\n {{! @glint-expect-error fix `AuRadioGroup` signature }}\n required={{true}}\n @name=\"isNew\"\n @selected={{this.generateNewUri}}\n @onChange={{this.shouldGenerateNewUri}}\n @alignment=\"inline\"\n as |Group|\n >\n <Group.Radio @value=\"yes\">Yes</Group.Radio>\n <Group.Radio @value=\"no\">No</Group.Radio>\n </AuRadioGroup>\n </WithUniqueId>\n </AuFormRow>\n <AuFormRow>\n <WithUniqueId as |id|>\n <AuLabel\n for={{id}}\n @required={{true}}\n @requiredLabel=\"Required\"\n >\n {{#if this.isNewUri}}URI base{{else}}Existing URI{{/if}}\n </AuLabel>\n <AuInput\n {{this.initialFocus}}\n id={{id}}\n required={{true}}\n value={{this.resourceUriBase}}\n @width=\"block\"\n placeholder=\"http://example.com/resource/\"\n {{on \"input\" this.updateUriBase}}\n />\n </WithUniqueId>\n </AuFormRow>\n </form>\n </:body>\n <:footer>\n <AuButtonGroup>\n <AuButton\n form={{formId}}\n type=\"submit\"\n @disabled={{not this.canSave}}\n >\n Save\n </AuButton>\n <AuButton\n @skin=\"secondary\"\n {{on \"click\" @closeModal}}\n >Cancel</AuButton>\n </AuButtonGroup>\n </:footer>\n </AuModal>\n </WithUniqueId>\n </template>\n}\n"],"names":["WrappingUtils","Component","g","prototype","tracked","i","constructor","owner","args","wrapWithResource","wrapWithBlockResource","setUpListeners","modifier","listenerHandler","event","altKey","ctrlKey","key","openModal","wrapWithLiteralNode","wrapWithInlineLiteralNode","window","addEventListener","removeEventListener","inline","wrapWithInlineResource","modalOpen","closeModal","controller","canWrapWithLiteral","checkCommand","wrapLiteral","canWrapWithInlineLiteral","wrapInlineLiteral","doCommand","details","wrapResource","wrapInlineResource","setComponentTemplate","precompileTemplate","strictMode","scope","AuContent","AuToolbar","AuButton","PlusIcon","on","fn","not","Modal","setupFormSubmitShortcut","formElement","ctrlEnterHandler","metaKey","requestSubmit","initialFocus","element","initiallyFocusedElement","updateUriBase","resourceUriBase","target","value","shouldGenerateNewUri","generateNewUri","save","preventDefault","isNewUri","uriBase","existingUri","canSave","WithUniqueId","AuModal","AuFormRow","AuLabel","AuRadioGroup","AuInput","AuButtonGroup"],"mappings":"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"}