diff --git a/docs/api/apiv3/components/examples/portfolio.yml b/docs/api/apiv3/components/examples/portfolio.yml index 488e4f221dcd..17ade74a9aca 100644 --- a/docs/api/apiv3/components/examples/portfolio.yml +++ b/docs/api/apiv3/components/examples/portfolio.yml @@ -54,3 +54,4 @@ value: createdAt: '2014-05-21T08:51:20.396Z' updatedAt: '2014-05-21T08:51:20.396Z' customField123: 123 + customComment123: Why is the value 123? diff --git a/docs/api/apiv3/components/examples/portfolio_body.yml b/docs/api/apiv3/components/examples/portfolio_body.yml index 908df4144ee6..a0e3622312b9 100644 --- a/docs/api/apiv3/components/examples/portfolio_body.yml +++ b/docs/api/apiv3/components/examples/portfolio_body.yml @@ -7,6 +7,7 @@ value: description: raw: Lorem **ipsum** dolor sit amet customField123: 123 + customComment123: Because it is 123! _links: parent: href: "/api/v3/portfolios/123" diff --git a/docs/api/apiv3/components/examples/program.yml b/docs/api/apiv3/components/examples/program.yml index a43e74f1a876..137edbac77ee 100644 --- a/docs/api/apiv3/components/examples/program.yml +++ b/docs/api/apiv3/components/examples/program.yml @@ -54,3 +54,4 @@ value: createdAt: '2014-05-21T08:51:20.396Z' updatedAt: '2014-05-21T08:51:20.396Z' customField123: 123 + customComment123: Why is the value 123? diff --git a/docs/api/apiv3/components/examples/program_body.yml b/docs/api/apiv3/components/examples/program_body.yml index 41d26bd80dde..ee52497bf4f2 100644 --- a/docs/api/apiv3/components/examples/program_body.yml +++ b/docs/api/apiv3/components/examples/program_body.yml @@ -7,6 +7,7 @@ value: description: raw: Lorem **ipsum** dolor sit amet customField123: 123 + customComment123: Because it is 123! _links: parent: href: "/api/v3/programs/123" diff --git a/docs/api/apiv3/components/examples/project.yml b/docs/api/apiv3/components/examples/project.yml index e1a6f7645b55..3b6d8a194800 100644 --- a/docs/api/apiv3/components/examples/project.yml +++ b/docs/api/apiv3/components/examples/project.yml @@ -54,3 +54,4 @@ value: createdAt: '2014-05-21T08:51:20.396Z' updatedAt: '2014-05-21T08:51:20.396Z' customField123: 123 + customComment123: Why is the value 123? diff --git a/docs/api/apiv3/components/examples/project_body.yml b/docs/api/apiv3/components/examples/project_body.yml index 2ffe05a69348..2d1584220cab 100644 --- a/docs/api/apiv3/components/examples/project_body.yml +++ b/docs/api/apiv3/components/examples/project_body.yml @@ -7,6 +7,7 @@ value: description: raw: Lorem **ipsum** dolor sit amet customField123: 123 + customComment123: Because it is 123! _links: parent: href: "/api/v3/projects/123" diff --git a/docs/api/apiv3/components/schemas/custom_comment_properties.yml b/docs/api/apiv3/components/schemas/custom_comment_properties.yml new file mode 100644 index 000000000000..bcf63a2e1285 --- /dev/null +++ b/docs/api/apiv3/components/schemas/custom_comment_properties.yml @@ -0,0 +1,12 @@ +# Schema: CustomCommentProperties +--- +type: object +patternProperties: + "^customComment\\d+$": + type: + - "null" + - string + description: |- + A plain-text comment associated with a project custom field that has comments enabled. + + The property is only present when the corresponding `customField{N}` has `has_comment` set to `true`. diff --git a/docs/api/apiv3/components/schemas/group_model.yml b/docs/api/apiv3/components/schemas/group_model.yml index 01d425860491..47ab1a98665a 100644 --- a/docs/api/apiv3/components/schemas/group_model.yml +++ b/docs/api/apiv3/components/schemas/group_model.yml @@ -2,6 +2,7 @@ --- allOf: - $ref: './principal_model.yml' + - $ref: "./custom_field_properties.yml" - type: object required: - _type diff --git a/docs/api/apiv3/components/schemas/portfolio_model.yml b/docs/api/apiv3/components/schemas/portfolio_model.yml index 530606375700..1e8191e4c40f 100644 --- a/docs/api/apiv3/components/schemas/portfolio_model.yml +++ b/docs/api/apiv3/components/schemas/portfolio_model.yml @@ -1,220 +1,223 @@ # Schema: PortfolioModel --- -type: object -properties: - _type: - type: string - enum: - - Portfolio - id: - type: integer - description: Portfolios' id - minimum: 1 - identifier: - type: string - name: - type: string - active: - type: boolean - description: Indicates whether the portfolio is currently active or already archived - favorited: - type: boolean - description: Indicates whether the portfolio is favorited by the current user - statusExplanation: - allOf: - - $ref: './formattable.yml' - - description: A text detailing and explaining why the portfolio has the reported status - public: - type: boolean - description: Indicates whether the portfolio is accessible for everybody - description: - $ref: './formattable.yml' - createdAt: - type: string - format: date-time - description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. - updatedAt: - type: string - format: date-time - description: Time of the most recent change to the portfolio - _links: - type: object - required: - - self - - categories +allOf: + - $ref: "./custom_field_properties.yml" + - $ref: "./custom_comment_properties.yml" + - type: object properties: - update: - allOf: - - $ref: './link.yml' - - description: |- - Form endpoint that aids in updating this portfolio - - # Conditions - - **Permission**: edit workspace - updateImmediately: - allOf: - - $ref: './link.yml' - - description: |- - Directly update this portfolio - - # Conditions - - **Permission**: edit workspace - delete: - allOf: - - $ref: './link.yml' - - description: |- - Delete this portfolio - - # Conditions - - **Permission**: admin - favor: - allOf: - - $ref: './link.yml' - - description: |- - Mark this portfolio as favorited by the current user - - # Conditions - - Only present if the portfolio is not yet favorited - - Permission**: none but login is required - disfavor: - allOf: - - $ref: './link.yml' - - description: |- - Mark this portfolio as not favorited by the current user - - # Conditions - Only present if the portfolio is favorited by the current user - - Permission**: none but login is required - createWorkPackage: - allOf: - - $ref: './link.yml' - - description: |- - Form endpoint that aids in preparing and creating a work package - - # Conditions - - **Permission**: add work packages - createWorkPackageImmediately: - allOf: - - $ref: './link.yml' - - description: |- - Directly creates a work package in the portfolio - - # Conditions - - **Permission**: add work packages - self: - allOf: - - $ref: './link.yml' - - description: |- - This portfolio - - **Resource**: Portfolio - categories: - allOf: - - $ref: './link.yml' - - description: |- - Categories available in this portfolio - - **Resource**: Collection - types: - allOf: - - $ref: './link.yml' - - description: |- - Types available in this portfolio - - **Resource**: Collection - - # Conditions - - **Permission**: view work packages or manage types - versions: - allOf: - - $ref: './link.yml' - - description: |- - Versions available in this portfolio - - **Resource**: Collection - - # Conditions - - **Permission**: view work packages or manage versions - memberships: - allOf: - - $ref: './link.yml' - - description: |- - Memberships in the portfolio - - **Resource**: Collection - - # Conditions - - **Permission**: view members - workPackages: - allOf: - - $ref: './link.yml' - - description: |- - Work Packages of this portfolio - - **Resource**: Collection - parent: - allOf: - - $ref: './link.yml' - - description: |- - Parent of the portfolio - - **Resource**: Portfolio - - # Conditions - - **Permission** edit workspace - status: - allOf: - - $ref: './link.yml' - - description: |- - Denotes the status of the portfolio, so whether the portfolio is on track, at risk or is having trouble. - - **Resource**: ProjectStatus - - # Conditions - - **Permission** edit workspace - storages: - type: array - items: - allOf: - - $ref: './link.yml' - - description: |- - The link to a storage that is active for this portfolio. - - **Resource**: Storage - - # Conditions - - **Permission**: view_file_links - projectStorages: - allOf: - - $ref: './link.yml' - - description: |- - The project storage collection of this portfolio. - - **Resource**: Collection - - # Conditions - - **Permission**: view_file_links - ancestors: - type: array - items: - allOf: - - $ref: './link.yml' - - description: |- - A collection of links to the ancestor portfolios. - - **Resource**: Portfolio + _type: + type: string + enum: + - Portfolio + id: + type: integer + description: Portfolios' id + minimum: 1 + identifier: + type: string + name: + type: string + active: + type: boolean + description: Indicates whether the portfolio is currently active or already archived + favorited: + type: boolean + description: Indicates whether the portfolio is favorited by the current user + statusExplanation: + allOf: + - $ref: './formattable.yml' + - description: A text detailing and explaining why the portfolio has the reported status + public: + type: boolean + description: Indicates whether the portfolio is accessible for everybody + description: + $ref: './formattable.yml' + createdAt: + type: string + format: date-time + description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. + updatedAt: + type: string + format: date-time + description: Time of the most recent change to the portfolio + _links: + type: object + required: + - self + - categories + properties: + update: + allOf: + - $ref: './link.yml' + - description: |- + Form endpoint that aids in updating this portfolio + + # Conditions + + **Permission**: edit workspace + updateImmediately: + allOf: + - $ref: './link.yml' + - description: |- + Directly update this portfolio + + # Conditions + + **Permission**: edit workspace + delete: + allOf: + - $ref: './link.yml' + - description: |- + Delete this portfolio + + # Conditions + + **Permission**: admin + favor: + allOf: + - $ref: './link.yml' + - description: |- + Mark this portfolio as favorited by the current user + + # Conditions + + Only present if the portfolio is not yet favorited + + Permission**: none but login is required + disfavor: + allOf: + - $ref: './link.yml' + - description: |- + Mark this portfolio as not favorited by the current user + + # Conditions + Only present if the portfolio is favorited by the current user + + Permission**: none but login is required + createWorkPackage: + allOf: + - $ref: './link.yml' + - description: |- + Form endpoint that aids in preparing and creating a work package + + # Conditions + + **Permission**: add work packages + createWorkPackageImmediately: + allOf: + - $ref: './link.yml' + - description: |- + Directly creates a work package in the portfolio + + # Conditions + + **Permission**: add work packages + self: + allOf: + - $ref: './link.yml' + - description: |- + This portfolio + + **Resource**: Portfolio + categories: + allOf: + - $ref: './link.yml' + - description: |- + Categories available in this portfolio + + **Resource**: Collection + types: + allOf: + - $ref: './link.yml' + - description: |- + Types available in this portfolio + + **Resource**: Collection + + # Conditions + + **Permission**: view work packages or manage types + versions: + allOf: + - $ref: './link.yml' + - description: |- + Versions available in this portfolio + + **Resource**: Collection + + # Conditions + + **Permission**: view work packages or manage versions + memberships: + allOf: + - $ref: './link.yml' + - description: |- + Memberships in the portfolio + + **Resource**: Collection + + # Conditions + + **Permission**: view members + workPackages: + allOf: + - $ref: './link.yml' + - description: |- + Work Packages of this portfolio + + **Resource**: Collection + parent: + allOf: + - $ref: './link.yml' + - description: |- + Parent of the portfolio + + **Resource**: Portfolio + + # Conditions + + **Permission** edit workspace + status: + allOf: + - $ref: './link.yml' + - description: |- + Denotes the status of the portfolio, so whether the portfolio is on track, at risk or is having trouble. + + **Resource**: ProjectStatus + + # Conditions + + **Permission** edit workspace + storages: + type: array + items: + allOf: + - $ref: './link.yml' + - description: |- + The link to a storage that is active for this portfolio. + + **Resource**: Storage + + # Conditions + + **Permission**: view_file_links + projectStorages: + allOf: + - $ref: './link.yml' + - description: |- + The project storage collection of this portfolio. + + **Resource**: Collection + + # Conditions + + **Permission**: view_file_links + ancestors: + type: array + items: + allOf: + - $ref: './link.yml' + - description: |- + A collection of links to the ancestor portfolios. + + **Resource**: Portfolio diff --git a/docs/api/apiv3/components/schemas/program_model.yml b/docs/api/apiv3/components/schemas/program_model.yml index a8651c5e67e3..1abe73e4e0d2 100644 --- a/docs/api/apiv3/components/schemas/program_model.yml +++ b/docs/api/apiv3/components/schemas/program_model.yml @@ -1,220 +1,223 @@ # Schema: ProgramModel --- -type: object -properties: - _type: - type: string - enum: - - Program - id: - type: integer - description: Programs' id - minimum: 1 - identifier: - type: string - name: - type: string - active: - type: boolean - description: Indicates whether the program is currently active or already archived - favorited: - type: boolean - description: Indicates whether the program is favorited by the current user - statusExplanation: - allOf: - - $ref: './formattable.yml' - - description: A text detailing and explaining why the program has the reported status - public: - type: boolean - description: Indicates whether the program is accessible for everybody - description: - $ref: './formattable.yml' - createdAt: - type: string - format: date-time - description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. - updatedAt: - type: string - format: date-time - description: Time of the most recent change to the program - _links: - type: object - required: - - self - - categories +allOf: + - $ref: "./custom_field_properties.yml" + - $ref: "./custom_comment_properties.yml" + - type: object properties: - update: - allOf: - - $ref: './link.yml' - - description: |- - Form endpoint that aids in updating this program - - # Conditions - - **Permission**: edit workspace - updateImmediately: - allOf: - - $ref: './link.yml' - - description: |- - Directly update this program - - # Conditions - - **Permission**: edit workspace - delete: - allOf: - - $ref: './link.yml' - - description: |- - Delete this program - - # Conditions - - **Permission**: admin - favor: - allOf: - - $ref: './link.yml' - - description: |- - Mark this program as favorited by the current user - - # Conditions - - Only present if the program is not yet favorited - - Permission**: none but login is required - disfavor: - allOf: - - $ref: './link.yml' - - description: |- - Mark this program as not favorited by the current user - - # Conditions - Only present if the program is favorited by the current user - - Permission**: none but login is required - createWorkPackage: - allOf: - - $ref: './link.yml' - - description: |- - Form endpoint that aids in preparing and creating a work package - - # Conditions - - **Permission**: add work packages - createWorkPackageImmediately: - allOf: - - $ref: './link.yml' - - description: |- - Directly creates a work package in the program - - # Conditions - - **Permission**: add work packages - self: - allOf: - - $ref: './link.yml' - - description: |- - This program - - **Resource**: Program - categories: - allOf: - - $ref: './link.yml' - - description: |- - Categories available in this program - - **Resource**: Collection - types: - allOf: - - $ref: './link.yml' - - description: |- - Types available in this program - - **Resource**: Collection - - # Conditions - - **Permission**: view work packages or manage types - versions: - allOf: - - $ref: './link.yml' - - description: |- - Versions available in this program - - **Resource**: Collection - - # Conditions - - **Permission**: view work packages or manage versions - memberships: - allOf: - - $ref: './link.yml' - - description: |- - Memberships in the program - - **Resource**: Collection - - # Conditions - - **Permission**: view members - workPackages: - allOf: - - $ref: './link.yml' - - description: |- - Work Packages of this program - - **Resource**: Collection - parent: - allOf: - - $ref: './link.yml' - - description: |- - Parent of the program - - **Resource**: Program - - # Conditions - - **Permission** edit workspace - status: - allOf: - - $ref: './link.yml' - - description: |- - Denotes the status of the program, so whether the program is on track, at risk or is having trouble. - - **Resource**: ProjectStatus - - # Conditions - - **Permission** edit workspace - storages: - type: array - items: - allOf: - - $ref: './link.yml' - - description: |- - The link to a storage that is active for this program. - - **Resource**: Storage - - # Conditions - - **Permission**: view_file_links - projectStorages: - allOf: - - $ref: './link.yml' - - description: |- - The project storage collection of this program. - - **Resource**: Collection - - # Conditions - - **Permission**: view_file_links - ancestors: - type: array - items: - allOf: - - $ref: './link.yml' - - description: |- - A collection of links to the ancestor workspace. - - **Resource**: Workspace + _type: + type: string + enum: + - Program + id: + type: integer + description: Programs' id + minimum: 1 + identifier: + type: string + name: + type: string + active: + type: boolean + description: Indicates whether the program is currently active or already archived + favorited: + type: boolean + description: Indicates whether the program is favorited by the current user + statusExplanation: + allOf: + - $ref: './formattable.yml' + - description: A text detailing and explaining why the program has the reported status + public: + type: boolean + description: Indicates whether the program is accessible for everybody + description: + $ref: './formattable.yml' + createdAt: + type: string + format: date-time + description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. + updatedAt: + type: string + format: date-time + description: Time of the most recent change to the program + _links: + type: object + required: + - self + - categories + properties: + update: + allOf: + - $ref: './link.yml' + - description: |- + Form endpoint that aids in updating this program + + # Conditions + + **Permission**: edit workspace + updateImmediately: + allOf: + - $ref: './link.yml' + - description: |- + Directly update this program + + # Conditions + + **Permission**: edit workspace + delete: + allOf: + - $ref: './link.yml' + - description: |- + Delete this program + + # Conditions + + **Permission**: admin + favor: + allOf: + - $ref: './link.yml' + - description: |- + Mark this program as favorited by the current user + + # Conditions + + Only present if the program is not yet favorited + + Permission**: none but login is required + disfavor: + allOf: + - $ref: './link.yml' + - description: |- + Mark this program as not favorited by the current user + + # Conditions + Only present if the program is favorited by the current user + + Permission**: none but login is required + createWorkPackage: + allOf: + - $ref: './link.yml' + - description: |- + Form endpoint that aids in preparing and creating a work package + + # Conditions + + **Permission**: add work packages + createWorkPackageImmediately: + allOf: + - $ref: './link.yml' + - description: |- + Directly creates a work package in the program + + # Conditions + + **Permission**: add work packages + self: + allOf: + - $ref: './link.yml' + - description: |- + This program + + **Resource**: Program + categories: + allOf: + - $ref: './link.yml' + - description: |- + Categories available in this program + + **Resource**: Collection + types: + allOf: + - $ref: './link.yml' + - description: |- + Types available in this program + + **Resource**: Collection + + # Conditions + + **Permission**: view work packages or manage types + versions: + allOf: + - $ref: './link.yml' + - description: |- + Versions available in this program + + **Resource**: Collection + + # Conditions + + **Permission**: view work packages or manage versions + memberships: + allOf: + - $ref: './link.yml' + - description: |- + Memberships in the program + + **Resource**: Collection + + # Conditions + + **Permission**: view members + workPackages: + allOf: + - $ref: './link.yml' + - description: |- + Work Packages of this program + + **Resource**: Collection + parent: + allOf: + - $ref: './link.yml' + - description: |- + Parent of the program + + **Resource**: Program + + # Conditions + + **Permission** edit workspace + status: + allOf: + - $ref: './link.yml' + - description: |- + Denotes the status of the program, so whether the program is on track, at risk or is having trouble. + + **Resource**: ProjectStatus + + # Conditions + + **Permission** edit workspace + storages: + type: array + items: + allOf: + - $ref: './link.yml' + - description: |- + The link to a storage that is active for this program. + + **Resource**: Storage + + # Conditions + + **Permission**: view_file_links + projectStorages: + allOf: + - $ref: './link.yml' + - description: |- + The project storage collection of this program. + + **Resource**: Collection + + # Conditions + + **Permission**: view_file_links + ancestors: + type: array + items: + allOf: + - $ref: './link.yml' + - description: |- + A collection of links to the ancestor workspace. + + **Resource**: Workspace diff --git a/docs/api/apiv3/components/schemas/project_model.yml b/docs/api/apiv3/components/schemas/project_model.yml index f1553401a829..4a1c3fd3871d 100644 --- a/docs/api/apiv3/components/schemas/project_model.yml +++ b/docs/api/apiv3/components/schemas/project_model.yml @@ -1,220 +1,223 @@ # Schema: ProjectModel --- -type: object -properties: - _type: - type: string - enum: - - Project - id: - type: integer - description: Projects' id - minimum: 1 - identifier: - type: string - name: - type: string - active: - type: boolean - description: Indicates whether the project is currently active or already archived - favorited: - type: boolean - description: Indicates whether the project is favorited by the current user - statusExplanation: - allOf: - - $ref: './formattable.yml' - - description: A text detailing and explaining why the project has the reported status - public: - type: boolean - description: Indicates whether the project is accessible for everybody - description: - $ref: './formattable.yml' - createdAt: - type: string - format: date-time - description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. - updatedAt: - type: string - format: date-time - description: Time of the most recent change to the project - _links: - type: object - required: - - self - - categories +allOf: + - $ref: "./custom_field_properties.yml" + - $ref: "./custom_comment_properties.yml" + - type: object properties: - update: - allOf: - - $ref: './link.yml' - - description: |- - Form endpoint that aids in updating this project - - # Conditions - - **Permission**: edit workspace - updateImmediately: - allOf: - - $ref: './link.yml' - - description: |- - Directly update this project - - # Conditions - - **Permission**: edit workspace - delete: - allOf: - - $ref: './link.yml' - - description: |- - Delete this project - - # Conditions - - **Permission**: admin - favor: - allOf: - - $ref: './link.yml' - - description: |- - Mark this project as favorited by the current user - - # Conditions - - Only present if the project is not yet favorited - - Permission**: none but login is required - disfavor: - allOf: - - $ref: './link.yml' - - description: |- - Mark this project as not favorited by the current user - - # Conditions - Only present if the project is favorited by the current user - - Permission**: none but login is required - createWorkPackage: - allOf: - - $ref: './link.yml' - - description: |- - Form endpoint that aids in preparing and creating a work package - - # Conditions - - **Permission**: add work packages - createWorkPackageImmediately: - allOf: - - $ref: './link.yml' - - description: |- - Directly creates a work package in the project - - # Conditions - - **Permission**: add work packages - self: - allOf: - - $ref: './link.yml' - - description: |- - This project - - **Resource**: Project - categories: - allOf: - - $ref: './link.yml' - - description: |- - Categories available in this project - - **Resource**: Collection - types: - allOf: - - $ref: './link.yml' - - description: |- - Types available in this project - - **Resource**: Collection - - # Conditions - - **Permission**: view work packages or manage types - versions: - allOf: - - $ref: './link.yml' - - description: |- - Versions available in this project - - **Resource**: Collection - - # Conditions - - **Permission**: view work packages or manage versions - memberships: - allOf: - - $ref: './link.yml' - - description: |- - Memberships in the project - - **Resource**: Collection - - # Conditions - - **Permission**: view members - workPackages: - allOf: - - $ref: './link.yml' - - description: |- - Work Packages of this project - - **Resource**: Collection - parent: - allOf: - - $ref: './link.yml' - - description: |- - Parent of the project - - **Resource**: Workspace - - # Conditions - - **Permission** edit workspace - status: - allOf: - - $ref: './link.yml' - - description: |- - Denotes the status of the project, so whether the project is on track, at risk or is having trouble. - - **Resource**: ProjectStatus - - # Conditions - - **Permission** edit workspace - storages: - type: array - items: - allOf: - - $ref: './link.yml' - - description: |- - The link to a storage that is active for this project. - - **Resource**: Storage - - # Conditions - - **Permission**: view_file_links - projectStorages: - allOf: - - $ref: './link.yml' - - description: |- - The project storage collection of this project. - - **Resource**: Collection - - # Conditions - - **Permission**: view_file_links - ancestors: - type: array - items: - allOf: - - $ref: './link.yml' - - description: |- - A collection of links to the ancestor workspaces. - - **Resource**: Workspace + _type: + type: string + enum: + - Project + id: + type: integer + description: Projects' id + minimum: 1 + identifier: + type: string + name: + type: string + active: + type: boolean + description: Indicates whether the project is currently active or already archived + favorited: + type: boolean + description: Indicates whether the project is favorited by the current user + statusExplanation: + allOf: + - $ref: './formattable.yml' + - description: A text detailing and explaining why the project has the reported status + public: + type: boolean + description: Indicates whether the project is accessible for everybody + description: + $ref: './formattable.yml' + createdAt: + type: string + format: date-time + description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. + updatedAt: + type: string + format: date-time + description: Time of the most recent change to the project + _links: + type: object + required: + - self + - categories + properties: + update: + allOf: + - $ref: './link.yml' + - description: |- + Form endpoint that aids in updating this project + + # Conditions + + **Permission**: edit workspace + updateImmediately: + allOf: + - $ref: './link.yml' + - description: |- + Directly update this project + + # Conditions + + **Permission**: edit workspace + delete: + allOf: + - $ref: './link.yml' + - description: |- + Delete this project + + # Conditions + + **Permission**: admin + favor: + allOf: + - $ref: './link.yml' + - description: |- + Mark this project as favorited by the current user + + # Conditions + + Only present if the project is not yet favorited + + Permission**: none but login is required + disfavor: + allOf: + - $ref: './link.yml' + - description: |- + Mark this project as not favorited by the current user + + # Conditions + Only present if the project is favorited by the current user + + Permission**: none but login is required + createWorkPackage: + allOf: + - $ref: './link.yml' + - description: |- + Form endpoint that aids in preparing and creating a work package + + # Conditions + + **Permission**: add work packages + createWorkPackageImmediately: + allOf: + - $ref: './link.yml' + - description: |- + Directly creates a work package in the project + + # Conditions + + **Permission**: add work packages + self: + allOf: + - $ref: './link.yml' + - description: |- + This project + + **Resource**: Project + categories: + allOf: + - $ref: './link.yml' + - description: |- + Categories available in this project + + **Resource**: Collection + types: + allOf: + - $ref: './link.yml' + - description: |- + Types available in this project + + **Resource**: Collection + + # Conditions + + **Permission**: view work packages or manage types + versions: + allOf: + - $ref: './link.yml' + - description: |- + Versions available in this project + + **Resource**: Collection + + # Conditions + + **Permission**: view work packages or manage versions + memberships: + allOf: + - $ref: './link.yml' + - description: |- + Memberships in the project + + **Resource**: Collection + + # Conditions + + **Permission**: view members + workPackages: + allOf: + - $ref: './link.yml' + - description: |- + Work Packages of this project + + **Resource**: Collection + parent: + allOf: + - $ref: './link.yml' + - description: |- + Parent of the project + + **Resource**: Workspace + + # Conditions + + **Permission** edit workspace + status: + allOf: + - $ref: './link.yml' + - description: |- + Denotes the status of the project, so whether the project is on track, at risk or is having trouble. + + **Resource**: ProjectStatus + + # Conditions + + **Permission** edit workspace + storages: + type: array + items: + allOf: + - $ref: './link.yml' + - description: |- + The link to a storage that is active for this project. + + **Resource**: Storage + + # Conditions + + **Permission**: view_file_links + projectStorages: + allOf: + - $ref: './link.yml' + - description: |- + The project storage collection of this project. + + **Resource**: Collection + + # Conditions + + **Permission**: view_file_links + ancestors: + type: array + items: + allOf: + - $ref: './link.yml' + - description: |- + A collection of links to the ancestor workspaces. + + **Resource**: Workspace diff --git a/docs/api/apiv3/components/schemas/time_entry_model.yml b/docs/api/apiv3/components/schemas/time_entry_model.yml index 502a25f454bf..e005cc937dfc 100644 --- a/docs/api/apiv3/components/schemas/time_entry_model.yml +++ b/docs/api/apiv3/components/schemas/time_entry_model.yml @@ -1,171 +1,173 @@ # Schema: TimeEntryModel --- -type: object -properties: - id: - type: integer - description: The id of the time entry - minimum: 1 - comment: - allOf: - - $ref: './formattable.yml' - - description: A comment to the time entry - spentOn: - type: string - format: date - description: The date the expenditure is booked for - hours: - type: string - format: duration - description: The time quantifying the expenditure - ongoing: - type: boolean - description: Whether the time entry is actively tracking time - createdAt: - type: string - format: date-time - description: The time the time entry was created - startTime: - type: - - string - - "null" - format: date-time - description: |- - The time the time entry was started, or null if the time entry does not have a start time. - - The time is returned as UTC time, if presented to the user it should be converted to the user's timezone. - - This field is only available if the global `allow_tracking_start_and_end_times` setting is enabled. - endTime: - type: - - string - - "null" - format: date-time - description: |- - The time the time entry was ended, or null if the time entry does not have a start time. - - The time is returned as UTC time, if presented to the user it should be converted to the user's timezone. - - This field is only available if the global `allow_tracking_start_and_end_times` setting is enabled. - updatedAt: - type: string - format: date-time - description: The time the time entry was last updated - _links: - type: object - required: - - self - - project - - user - - activity - - entity +allOf: + - $ref: "./custom_field_properties.yml" + - type: object properties: - self: + id: + type: integer + description: The id of the time entry + minimum: 1 + comment: allOf: - - "$ref": "./link.yml" - - description: |- - This time entry - - **Resource**: TimeEntry - updateImmediately: - allOf: - - "$ref": "./link.yml" - - description: |- - Directly perform edits on this time entry - - # Conditions - - **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user - update: - allOf: - - "$ref": "./link.yml" - - description: |- - Form endpoint that aids in preparing and performing edits on a TimeEntry - - # Conditions - - **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user - delete: - allOf: - - "$ref": "./link.yml" - - description: |- - Delete this time entry - - # Conditions - - **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user - schema: - allOf: - - "$ref": "./link.yml" - - description: |- - The time entry schema - - **Resource**: Schema - project: - allOf: - - "$ref": "./link.yml" - - description: |- - The project the time entry is bundled in. The project might be different from the work package's project once the workPackage is moved. - - **Resource**: Project - entity: - allOf: - - "$ref": "./link.yml" - - description: |- - The entity the time entry is created on - - **Resource**: WorkPackage, Meeting - user: - allOf: - - "$ref": "./link.yml" - - description: |- - The user the time entry tracks expenditures for - - **Resource**: User - activity: - allOf: - - "$ref": "./link.yml" - - description: |- - The time entry activity the time entry is categorized as - - **Resource**: TimeEntriesActivity - -example: - _type: TimeEntry - id: 42 - comment: - format: plain - raw: "The force shall set me free." - html: "
The force shall set me free.
" - spentOn: "2023-01-11" - hours: "PT4H" - startTime: "2023-01-11T09:58:00.000Z" - endTime: "2023-01-11T13:58:00.000Z" - createdAt: "2023-01-11T13:58:24.927Z" - updatedAt: "2023-01-11T13:58:24.927Z" - _links: - self: - href: "/api/v3/time_entries/42" - updateImmediately: - href: "/api/v3/time_entries/42" - method: patch - update: - href: "/api/v3/time_entries/42/form" - method: post - delete: - href: "/api/v3/time_entries/42" - method: delete - schema: - href: "/api/v3/time_entries/schema" - project: - href: "/api/v3/projects/11" - title: DeathStarV2 - entity: - href: "/api/v3/work_packages/77" - title: Build new hangar - user: - href: "/api/v3/users/3" - title: Darth Vader - activity: - href: "/api/v3/time_entries/activities/1" - title: Management + - $ref: './formattable.yml' + - description: A comment to the time entry + spentOn: + type: string + format: date + description: The date the expenditure is booked for + hours: + type: string + format: duration + description: The time quantifying the expenditure + ongoing: + type: boolean + description: Whether the time entry is actively tracking time + createdAt: + type: string + format: date-time + description: The time the time entry was created + startTime: + type: + - string + - "null" + format: date-time + description: |- + The time the time entry was started, or null if the time entry does not have a start time. + + The time is returned as UTC time, if presented to the user it should be converted to the user's timezone. + + This field is only available if the global `allow_tracking_start_and_end_times` setting is enabled. + endTime: + type: + - string + - "null" + format: date-time + description: |- + The time the time entry was ended, or null if the time entry does not have a start time. + + The time is returned as UTC time, if presented to the user it should be converted to the user's timezone. + + This field is only available if the global `allow_tracking_start_and_end_times` setting is enabled. + updatedAt: + type: string + format: date-time + description: The time the time entry was last updated + _links: + type: object + required: + - self + - project + - user + - activity + - entity + properties: + self: + allOf: + - "$ref": "./link.yml" + - description: |- + This time entry + + **Resource**: TimeEntry + updateImmediately: + allOf: + - "$ref": "./link.yml" + - description: |- + Directly perform edits on this time entry + + # Conditions + + **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user + update: + allOf: + - "$ref": "./link.yml" + - description: |- + Form endpoint that aids in preparing and performing edits on a TimeEntry + + # Conditions + + **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user + delete: + allOf: + - "$ref": "./link.yml" + - description: |- + Delete this time entry + + # Conditions + + **Permission**: 'edit time entries' or 'edit own time entries' if the time entry belongs to the user + schema: + allOf: + - "$ref": "./link.yml" + - description: |- + The time entry schema + + **Resource**: Schema + project: + allOf: + - "$ref": "./link.yml" + - description: |- + The project the time entry is bundled in. The project might be different from the work package's project once the workPackage is moved. + + **Resource**: Project + entity: + allOf: + - "$ref": "./link.yml" + - description: |- + The entity the time entry is created on + + **Resource**: WorkPackage, Meeting + user: + allOf: + - "$ref": "./link.yml" + - description: |- + The user the time entry tracks expenditures for + + **Resource**: User + activity: + allOf: + - "$ref": "./link.yml" + - description: |- + The time entry activity the time entry is categorized as + + **Resource**: TimeEntriesActivity + + example: + _type: TimeEntry + id: 42 + comment: + format: plain + raw: "The force shall set me free." + html: "The force shall set me free.
" + spentOn: "2023-01-11" + hours: "PT4H" + startTime: "2023-01-11T09:58:00.000Z" + endTime: "2023-01-11T13:58:00.000Z" + createdAt: "2023-01-11T13:58:24.927Z" + updatedAt: "2023-01-11T13:58:24.927Z" + _links: + self: + href: "/api/v3/time_entries/42" + updateImmediately: + href: "/api/v3/time_entries/42" + method: patch + update: + href: "/api/v3/time_entries/42/form" + method: post + delete: + href: "/api/v3/time_entries/42" + method: delete + schema: + href: "/api/v3/time_entries/schema" + project: + href: "/api/v3/projects/11" + title: DeathStarV2 + entity: + href: "/api/v3/work_packages/77" + title: Build new hangar + user: + href: "/api/v3/users/3" + title: Darth Vader + activity: + href: "/api/v3/time_entries/activities/1" + title: Management diff --git a/docs/api/apiv3/components/schemas/user_model.yml b/docs/api/apiv3/components/schemas/user_model.yml index 99fe2cefac21..26ff2b818453 100644 --- a/docs/api/apiv3/components/schemas/user_model.yml +++ b/docs/api/apiv3/components/schemas/user_model.yml @@ -2,6 +2,7 @@ --- allOf: - $ref: './principal_model.yml' + - $ref: "./custom_field_properties.yml" - type: object required: - _type diff --git a/docs/api/apiv3/components/schemas/version_read_model.yml b/docs/api/apiv3/components/schemas/version_read_model.yml index e435541f9548..3a2679175f0a 100644 --- a/docs/api/apiv3/components/schemas/version_read_model.yml +++ b/docs/api/apiv3/components/schemas/version_read_model.yml @@ -1,141 +1,141 @@ # Schema: VersionReadModel --- -type: object -required: - - id - - _type - - name - - description - - startDate - - endDate - - status - - sharing - - createdAt - - updatedAt allOf: - $ref: "./custom_field_properties.yml" -properties: - id: - type: integer - description: Version id - minimum: 1 - _type: - type: string - enum: - - Version - name: - type: string - description: Version name - description: - $ref: "./formattable.yml" - startDate: - type: - - "string" - - "null" - format: date - endDate: - type: - - "string" - - "null" - format: date - status: - type: string - description: |- - The current status of the version. This could be: - - - *open*: if the version is available to be assigned to work packages in all shared projects - - *locked*: if the version is not finished, but locked for further assignments to work packages - - *closed*: if the version is finished - enum: - - open - - locked - - closed - sharing: - type: string - description: |- - The indicator of how the version is shared between projects. This could be: - - - *none*: if the version is only available in the defining project - - *descendants*: if the version is shared with the descendants of the defining project - - *hierarchy*: if the version is shared with the descendants and the ancestors of the defining project - - *tree*: if the version is shared with the root project of the defining project and all descendants of the root project - - *system*: if the version is shared globally - enum: - - none - - descendants - - hierarchy - - tree - - system - createdAt: - type: string - format: date-time - description: Time of creation - updatedAt: - type: string - format: date-time - description: Time of the most recent change to the version - _links: - type: object + - type: object required: - - self - - schema - - definingProject - - availableInProjects - allOf: - - $ref: "./custom_field_linked_properties.yml" + - id + - _type + - name + - description + - startDate + - endDate + - status + - sharing + - createdAt + - updatedAt properties: - self: + id: + type: integer + description: Version id + minimum: 1 + _type: + type: string + enum: + - Version + name: + type: string + description: Version name + description: + $ref: "./formattable.yml" + startDate: + type: + - "string" + - "null" + format: date + endDate: + type: + - "string" + - "null" + format: date + status: + type: string + description: |- + The current status of the version. This could be: + + - *open*: if the version is available to be assigned to work packages in all shared projects + - *locked*: if the version is not finished, but locked for further assignments to work packages + - *closed*: if the version is finished + enum: + - open + - locked + - closed + sharing: + type: string + description: |- + The indicator of how the version is shared between projects. This could be: + + - *none*: if the version is only available in the defining project + - *descendants*: if the version is shared with the descendants of the defining project + - *hierarchy*: if the version is shared with the descendants and the ancestors of the defining project + - *tree*: if the version is shared with the root project of the defining project and all descendants of the root project + - *system*: if the version is shared globally + enum: + - none + - descendants + - hierarchy + - tree + - system + createdAt: + type: string + format: date-time + description: Time of creation + updatedAt: + type: string + format: date-time + description: Time of the most recent change to the version + _links: allOf: - - $ref: "./link.yml" - - description: |- - This version - - **Resource**: Version - schema: - allOf: - - $ref: "./link.yml" - - description: |- - The schema of this version - - **Resource**: VersionSchema - update: - allOf: - - $ref: "./link.yml" - - description: |- - Form endpoint that aids in preparing and performing edits on the version - - # Conditions - - **Permission**: manage versions - delete: - allOf: - - $ref: "./link.yml" - - description: |- - Deletes this version - - # Conditions - - **Permission**: manage versions - updateImmediately: - allOf: - - $ref: "./link.yml" - - description: |- - Directly perform edits on the version - - # Conditions - - **Permission**: manage versions - definingProject: - allOf: - - $ref: "./link.yml" - - description: |- - The workspace to which the version belongs - - **Resource**: Workspace - availableInProjects: - allOf: - - $ref: "./link.yml" - - description: |- - Workspaces where this version can be used - - **Resource**: Workspace + - $ref: "./custom_field_linked_properties.yml" + - type: object + required: + - self + - schema + - definingProject + - availableInProjects + properties: + self: + allOf: + - $ref: "./link.yml" + - description: |- + This version + + **Resource**: Version + schema: + allOf: + - $ref: "./link.yml" + - description: |- + The schema of this version + + **Resource**: VersionSchema + update: + allOf: + - $ref: "./link.yml" + - description: |- + Form endpoint that aids in preparing and performing edits on the version + + # Conditions + + **Permission**: manage versions + delete: + allOf: + - $ref: "./link.yml" + - description: |- + Deletes this version + + # Conditions + + **Permission**: manage versions + updateImmediately: + allOf: + - $ref: "./link.yml" + - description: |- + Directly perform edits on the version + + # Conditions + + **Permission**: manage versions + definingProject: + allOf: + - $ref: "./link.yml" + - description: |- + The workspace to which the version belongs + + **Resource**: Workspace + availableInProjects: + allOf: + - $ref: "./link.yml" + - description: |- + Workspaces where this version can be used + + **Resource**: Workspace diff --git a/docs/api/apiv3/components/schemas/version_write_model.yml b/docs/api/apiv3/components/schemas/version_write_model.yml index 9fc4bba482cd..07c088159d71 100644 --- a/docs/api/apiv3/components/schemas/version_write_model.yml +++ b/docs/api/apiv3/components/schemas/version_write_model.yml @@ -1,61 +1,61 @@ # Schema: VersionWriteModel --- -type: object allOf: - $ref: "./custom_field_properties.yml" -properties: - name: - type: string - description: Version name - description: - $ref: "./formattable.yml" - startDate: - type: - - "string" - - "null" - format: date - endDate: - type: - - "string" - - "null" - format: date - status: - type: string - description: |- - The current status of the version. This could be: - - - *open*: if the version is available to be assigned to work packages in all shared projects - - *locked*: if the version is not finished, but locked for further assignments to work packages - - *closed*: if the version is finished - enum: - - open - - locked - - closed - sharing: - type: string - description: |- - The indicator of how the version is shared between projects. This could be: - - - *none*: if the version is only available in the defining project - - *descendants*: if the version is shared with the descendants of the defining project - - *hierarchy*: if the version is shared with the descendants and the ancestors of the defining project - - *tree*: if the version is shared with the root project of the defining project and all descendants of the root project - - *system*: if the version is shared globally - enum: - - none - - descendants - - hierarchy - - tree - - system - _links: - type: object - allOf: - - $ref: "./custom_field_linked_properties.yml" + - type: object properties: - definingProject: + name: + type: string + description: Version name + description: + $ref: "./formattable.yml" + startDate: + type: + - "string" + - "null" + format: date + endDate: + type: + - "string" + - "null" + format: date + status: + type: string + description: |- + The current status of the version. This could be: + + - *open*: if the version is available to be assigned to work packages in all shared projects + - *locked*: if the version is not finished, but locked for further assignments to work packages + - *closed*: if the version is finished + enum: + - open + - locked + - closed + sharing: + type: string + description: |- + The indicator of how the version is shared between projects. This could be: + + - *none*: if the version is only available in the defining project + - *descendants*: if the version is shared with the descendants of the defining project + - *hierarchy*: if the version is shared with the descendants and the ancestors of the defining project + - *tree*: if the version is shared with the root project of the defining project and all descendants of the root project + - *system*: if the version is shared globally + enum: + - none + - descendants + - hierarchy + - tree + - system + _links: allOf: - - $ref: "./link.yml" - - description: |- - The workspace to which the version belongs - - **Resource**: Workspace + - $ref: "./custom_field_linked_properties.yml" + - type: object + properties: + definingProject: + allOf: + - $ref: "./link.yml" + - description: |- + The workspace to which the version belongs + + **Resource**: Workspace diff --git a/docs/api/apiv3/components/schemas/work_package_model.yml b/docs/api/apiv3/components/schemas/work_package_model.yml index f0cf0da72a2a..69124fddef0b 100644 --- a/docs/api/apiv3/components/schemas/work_package_model.yml +++ b/docs/api/apiv3/components/schemas/work_package_model.yml @@ -1,539 +1,541 @@ # Schema: WorkPackageModel --- -type: object -required: - - subject - - _links -properties: - id: - type: integer - description: Work package id - readOnly: true - minimum: 1 - lockVersion: - type: integer - description: The version of the item as used for optimistic locking - readOnly: true - subject: - type: string - description: Work package subject - _type: - type: string - enum: - - WorkPackage - readOnly: true - description: - allOf: - - $ref: "./formattable.yml" - - description: The work package description - scheduleManually: - type: boolean - description: |- - Uses manual scheduling mode when true (default). Uses automatic scheduling - mode when false. Can be automatic only when predecessors or children are - present. - readonly: - type: boolean - description: If true, the work package is in a readonly status so with the exception of the status, no other property can be altered. - startDate: - type: - - "string" - - "null" - format: date - description: Scheduled beginning of a work package - dueDate: - type: - - "string" - - "null" - format: date - description: Scheduled end of a work package - date: - type: - - "string" - - "null" - format: date - description: Date on which a milestone is achieved - derivedStartDate: - type: - - "string" - - "null" - format: date - description: Similar to start date but is not set by a client but rather deduced - by the work packages' descendants. If manual scheduleManually is active, the - two dates can deviate. - readOnly: true - derivedDueDate: - type: - - "string" - - "null" - format: date - description: Similar to due date but is not set by a client but rather deduced - by the work packages' descendants. If manual scheduleManually is active, the - two dates can deviate. - readOnly: true - duration: - type: - - "string" - - "null" - format: duration - description: |- - **(NOT IMPLEMENTED)** The amount of time in hours the work package needs to be completed. - Not available for milestone type of work packages. - readOnly: true - estimatedTime: - type: - - "string" - - "null" - format: duration - description: Time a work package likely needs to be completed excluding its descendants - derivedEstimatedTime: - type: - - "string" - - "null" - format: duration - description: Time a work package likely needs to be completed including its descendants - readOnly: true - ignoreNonWorkingDays: - type: boolean - description: |- - **(NOT IMPLEMENTED)** When scheduling, whether or not to ignore the non working days being defined. - A work package with the flag set to true will be allowed to be scheduled to a non working day. - readOnly: true - spentTime: - type: string - format: duration - description: |- - The time booked for this work package by users working on it - - # Conditions - - **Permission** view time entries - readOnly: true - percentageDone: - type: - - "integer" - - "null" - description: Amount of total completion for a work package - minimum: 0 - maximum: 100 - derivedPercentageDone: - type: - - "integer" - - "null" - description: Amount of total completion for a work package derived from itself and its descendant work packages - readOnly: true - minimum: 0 - maximum: 100 - createdAt: - type: string - format: date-time - description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. - readOnly: true - updatedAt: - type: string - format: date-time - description: Time of the most recent change to the work package. - readOnly: true - _links: - type: object +allOf: + - $ref: "./custom_field_properties.yml" + - type: object required: - - self - - schema - - ancestors - - author - - priority - - project - - status - - type + - subject + - _links properties: - addComment: - allOf: - - $ref: "./link.yml" - - description: |- - Post comment to WP - - # Conditions - - **Permission**: add work package notes - readOnly: true - addRelation: - allOf: - - $ref: "./link.yml" - - description: |- - Adds a relation to this work package. - - # Conditions - - **Permission**: manage wp relations - readOnly: true - addWatcher: - allOf: - - $ref: "./link.yml" - - description: |- - Add any user to WP watchers - - # Conditions - - **Permission**: add watcher - readOnly: true - customActions: - type: array + id: + type: integer + description: Work package id readOnly: true - items: - allOf: - - $ref: "./link.yml" - - description: |- - A predefined action that can be applied to the work package. - - **Resource**: CustomAction - readOnly: true - previewMarkup: - allOf: - - $ref: "./link.yml" - - description: Post markup (in markdown) here to receive an HTML-rendered - response - readOnly: true - removeWatcher: - allOf: - - $ref: "./link.yml" - - description: |- - Remove any user from WP watchers - - # Conditions - - **Permission**: delete watcher - readOnly: true - delete: - allOf: - - $ref: "./link.yml" - - description: |- - Delete this work package - - # Conditions - - **Permission**: delete_work_packages - readOnly: true - logTime: - allOf: - - $ref: "./link.yml" - - description: |- - Create time entries on the work package - - # Conditions - - **Permission**: log_time or log_own_time - readOnly: true - move: - allOf: - - $ref: "./link.yml" - - description: |- - Link to page for moving this work package - - # Conditions - - **Permission**: move_work_packages - readOnly: true - copy: - allOf: - - $ref: "./link.yml" - - description: |- - Link to page for copying this work package - - # Conditions - - **Permission**: add_work_packages - readOnly: true - unwatch: - allOf: - - $ref: "./link.yml" - - description: |- - Remove current user from WP watchers - - # Conditions - - logged in; watching - readOnly: true - update: - allOf: - - $ref: "./link.yml" - - description: |- - Form endpoint that aids in preparing and performing edits on a work package - - # Conditions - - **Permission**: edit work package - readOnly: true - updateImmediately: - allOf: - - $ref: "./link.yml" - - description: |- - Directly perform edits on a work package - - # Conditions - - **Permission**: edit work package - readOnly: true - watch: - allOf: - - $ref: "./link.yml" - - description: |- - Add current user to WP watchers - - # Conditions - - logged in; not watching - readOnly: true - self: - allOf: - - $ref: "./link.yml" - - description: |- - This work package - - **Resource**: WorkPackage - readOnly: true - schema: - allOf: - - $ref: "./link.yml" - - description: |- - The schema of this work package - - **Resource**: Schema - readOnly: true - ancestors: - type: array + minimum: 1 + lockVersion: + type: integer + description: The version of the item as used for optimistic locking readOnly: true - items: - allOf: - - $ref: "./link.yml" - - description: |- - A visible ancestor work package of the current work package. - - **Resource**: WorkPackage - - # Conditions - - **Permission** view work packages - readOnly: true - attachments: - allOf: - - $ref: "./link.yml" - - description: |- - The files attached to this work package - - **Resource**: Collection - - # Conditions - - - **Setting**: deactivate_work_package_attachments set to false in related workspace - addAttachment: - allOf: - - $ref: "./link.yml" - - description: |- - Attach a file to the work package - - # Conditions - - - **Permission**: edit work package - readOnly: true - prepareAttachment: - allOf: - - $ref: "./link.yml" - - description: |- - Attach a file to the work package - - # Conditions - - - **Setting**: direct uploads enabled - readOnly: true - author: - allOf: - - $ref: "./link.yml" - - description: |- - The person that created the work package - - **Resource**: User - readOnly: true - assignee: - allOf: - - $ref: "./link.yml" - - description: |- - The person that is intended to work on the work package - - **Resource**: User - availableWatchers: - allOf: - - $ref: "./link.yml" - - description: |- - All users that can be added to the work package as watchers. - - **Resource**: User - - # Conditions - - **Permission** add work package watchers - readOnly: true - budget: - allOf: - - $ref: "./link.yml" - - description: |- - The budget this work package is associated to - - **Resource**: Budget - - # Conditions - - **Permission** view cost objects - category: - allOf: - - $ref: "./link.yml" - - description: |- - The category of the work package - - **Resource**: Category - children: - type: array + subject: + type: string + description: Work package subject + _type: + type: string + enum: + - WorkPackage readOnly: true - items: - allOf: - - $ref: "./link.yml" - - description: |- - A visible child work package of the current work package. - - **Resource**: WorkPackage - - # Conditions - - **Permission** view work packages - readOnly: true - addFileLink: - allOf: - - $ref: './link.yml' - - description: |- - Add a file link to the work package - - # Conditions - - **Permission**: manage_file_links - fileLinks: - allOf: - - $ref: './link.yml' - - description: |- - Gets the file link collection of this work package - - # Conditions - - **Permission**: view_file_links - parent: - allOf: - - $ref: "./link.yml" - - description: |- - Parent work package - - **Resource**: WorkPackage - priority: - allOf: - - $ref: "./link.yml" - - description: |- - The priority of the work package - - **Resource**: Priority - project: - allOf: - - $ref: "./link.yml" - - description: |- - The workspace to which the work package belongs - - **Resource**: Workspace - projectPhase: - allOf: - - $ref: "./link.yml" - - description: |- - The project phase to which the work package belongs - - **Resource**: ProjectPhase - projectPhaseDefinition: - allOf: - - $ref: "./link.yml" - - description: |- - The definition of the project phase the work package belongs to - - **Resource**: ProjectPhaseDefinition - responsible: - allOf: - - $ref: "./link.yml" - - description: |- - The person that is responsible for the overall outcome - - **Resource**: User - relations: - allOf: - - $ref: "./link.yml" - - description: |- - Relations this work package is involved in - - **Resource**: Relation - - # Conditions - - **Permission** view work packages - readOnly: true - revisions: - allOf: - - $ref: "./link.yml" - - description: |- - Revisions that are referencing the work package - - **Resource**: Revision + description: + allOf: + - $ref: "./formattable.yml" + - description: The work package description + scheduleManually: + type: boolean + description: |- + Uses manual scheduling mode when true (default). Uses automatic scheduling + mode when false. Can be automatic only when predecessors or children are + present. + readonly: + type: boolean + description: If true, the work package is in a readonly status so with the exception of the status, no other property can be altered. + startDate: + type: + - "string" + - "null" + format: date + description: Scheduled beginning of a work package + dueDate: + type: + - "string" + - "null" + format: date + description: Scheduled end of a work package + date: + type: + - "string" + - "null" + format: date + description: Date on which a milestone is achieved + derivedStartDate: + type: + - "string" + - "null" + format: date + description: Similar to start date but is not set by a client but rather deduced + by the work packages' descendants. If manual scheduleManually is active, the + two dates can deviate. + readOnly: true + derivedDueDate: + type: + - "string" + - "null" + format: date + description: Similar to due date but is not set by a client but rather deduced + by the work packages' descendants. If manual scheduleManually is active, the + two dates can deviate. + readOnly: true + duration: + type: + - "string" + - "null" + format: duration + description: |- + **(NOT IMPLEMENTED)** The amount of time in hours the work package needs to be completed. + Not available for milestone type of work packages. + readOnly: true + estimatedTime: + type: + - "string" + - "null" + format: duration + description: Time a work package likely needs to be completed excluding its descendants + derivedEstimatedTime: + type: + - "string" + - "null" + format: duration + description: Time a work package likely needs to be completed including its descendants + readOnly: true + ignoreNonWorkingDays: + type: boolean + description: |- + **(NOT IMPLEMENTED)** When scheduling, whether or not to ignore the non working days being defined. + A work package with the flag set to true will be allowed to be scheduled to a non working day. + readOnly: true + spentTime: + type: string + format: duration + description: |- + The time booked for this work package by users working on it - # Conditions + # Conditions - **Permission** view changesets + **Permission** view time entries + readOnly: true + percentageDone: + type: + - "integer" + - "null" + description: Amount of total completion for a work package + minimum: 0 + maximum: 100 + derivedPercentageDone: + type: + - "integer" + - "null" + description: Amount of total completion for a work package derived from itself and its descendant work packages + readOnly: true + minimum: 0 + maximum: 100 + createdAt: + type: string + format: date-time + description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled. + readOnly: true + updatedAt: + type: string + format: date-time + description: Time of the most recent change to the work package. + readOnly: true + _links: + type: object + required: + - self + - schema + - ancestors + - author + - priority + - project + - status + - type + properties: + addComment: + allOf: + - $ref: "./link.yml" + - description: |- + Post comment to WP + + # Conditions + + **Permission**: add work package notes + readOnly: true + addRelation: + allOf: + - $ref: "./link.yml" + - description: |- + Adds a relation to this work package. + + # Conditions + + **Permission**: manage wp relations + readOnly: true + addWatcher: + allOf: + - $ref: "./link.yml" + - description: |- + Add any user to WP watchers + + # Conditions + + **Permission**: add watcher + readOnly: true + customActions: + type: array readOnly: true - status: - allOf: - - $ref: "./link.yml" - - description: |- - The current status of the work package - - **Resource**: Status - timeEntries: - allOf: - - $ref: "./link.yml" - - description: |- - All time entries logged on the work package. Please note that this is a link to an HTML resource for now and as such, the link is subject to change. - - **Resource**: N/A - - # Conditions - - **Permission** view time entries + items: + allOf: + - $ref: "./link.yml" + - description: |- + A predefined action that can be applied to the work package. + + **Resource**: CustomAction + readOnly: true + previewMarkup: + allOf: + - $ref: "./link.yml" + - description: Post markup (in markdown) here to receive an HTML-rendered + response + readOnly: true + removeWatcher: + allOf: + - $ref: "./link.yml" + - description: |- + Remove any user from WP watchers + + # Conditions + + **Permission**: delete watcher + readOnly: true + delete: + allOf: + - $ref: "./link.yml" + - description: |- + Delete this work package + + # Conditions + + **Permission**: delete_work_packages + readOnly: true + logTime: + allOf: + - $ref: "./link.yml" + - description: |- + Create time entries on the work package + + # Conditions + + **Permission**: log_time or log_own_time + readOnly: true + move: + allOf: + - $ref: "./link.yml" + - description: |- + Link to page for moving this work package + + # Conditions + + **Permission**: move_work_packages + readOnly: true + copy: + allOf: + - $ref: "./link.yml" + - description: |- + Link to page for copying this work package + + # Conditions + + **Permission**: add_work_packages + readOnly: true + unwatch: + allOf: + - $ref: "./link.yml" + - description: |- + Remove current user from WP watchers + + # Conditions + + logged in; watching + readOnly: true + update: + allOf: + - $ref: "./link.yml" + - description: |- + Form endpoint that aids in preparing and performing edits on a work package + + # Conditions + + **Permission**: edit work package + readOnly: true + updateImmediately: + allOf: + - $ref: "./link.yml" + - description: |- + Directly perform edits on a work package + + # Conditions + + **Permission**: edit work package + readOnly: true + watch: + allOf: + - $ref: "./link.yml" + - description: |- + Add current user to WP watchers + + # Conditions + + logged in; not watching + readOnly: true + self: + allOf: + - $ref: "./link.yml" + - description: |- + This work package + + **Resource**: WorkPackage + readOnly: true + schema: + allOf: + - $ref: "./link.yml" + - description: |- + The schema of this work package + + **Resource**: Schema + readOnly: true + ancestors: + type: array readOnly: true - type: - allOf: - - $ref: "./link.yml" - - description: |- - The type of the work package - - **Resource**: Type - version: - allOf: - - $ref: "./link.yml" - - description: |- - The version associated to the work package - - **Resource**: Version - watchers: - allOf: - - $ref: "./link.yml" - - description: |- - All users that are currently watching this work package - - **Resource**: Collection - - # Conditions - - **Permission** view work package watchers + items: + allOf: + - $ref: "./link.yml" + - description: |- + A visible ancestor work package of the current work package. + + **Resource**: WorkPackage + + # Conditions + + **Permission** view work packages + readOnly: true + attachments: + allOf: + - $ref: "./link.yml" + - description: |- + The files attached to this work package + + **Resource**: Collection + + # Conditions + + - **Setting**: deactivate_work_package_attachments set to false in related workspace + addAttachment: + allOf: + - $ref: "./link.yml" + - description: |- + Attach a file to the work package + + # Conditions + + - **Permission**: edit work package + readOnly: true + prepareAttachment: + allOf: + - $ref: "./link.yml" + - description: |- + Attach a file to the work package + + # Conditions + + - **Setting**: direct uploads enabled + readOnly: true + author: + allOf: + - $ref: "./link.yml" + - description: |- + The person that created the work package + + **Resource**: User + readOnly: true + assignee: + allOf: + - $ref: "./link.yml" + - description: |- + The person that is intended to work on the work package + + **Resource**: User + availableWatchers: + allOf: + - $ref: "./link.yml" + - description: |- + All users that can be added to the work package as watchers. + + **Resource**: User + + # Conditions + + **Permission** add work package watchers + readOnly: true + budget: + allOf: + - $ref: "./link.yml" + - description: |- + The budget this work package is associated to + + **Resource**: Budget + + # Conditions + + **Permission** view cost objects + category: + allOf: + - $ref: "./link.yml" + - description: |- + The category of the work package + + **Resource**: Category + children: + type: array readOnly: true + items: + allOf: + - $ref: "./link.yml" + - description: |- + A visible child work package of the current work package. + + **Resource**: WorkPackage + + # Conditions + + **Permission** view work packages + readOnly: true + addFileLink: + allOf: + - $ref: './link.yml' + - description: |- + Add a file link to the work package + + # Conditions + + **Permission**: manage_file_links + fileLinks: + allOf: + - $ref: './link.yml' + - description: |- + Gets the file link collection of this work package + + # Conditions + + **Permission**: view_file_links + parent: + allOf: + - $ref: "./link.yml" + - description: |- + Parent work package + + **Resource**: WorkPackage + priority: + allOf: + - $ref: "./link.yml" + - description: |- + The priority of the work package + + **Resource**: Priority + project: + allOf: + - $ref: "./link.yml" + - description: |- + The workspace to which the work package belongs + + **Resource**: Workspace + projectPhase: + allOf: + - $ref: "./link.yml" + - description: |- + The project phase to which the work package belongs + + **Resource**: ProjectPhase + projectPhaseDefinition: + allOf: + - $ref: "./link.yml" + - description: |- + The definition of the project phase the work package belongs to + + **Resource**: ProjectPhaseDefinition + responsible: + allOf: + - $ref: "./link.yml" + - description: |- + The person that is responsible for the overall outcome + + **Resource**: User + relations: + allOf: + - $ref: "./link.yml" + - description: |- + Relations this work package is involved in + + **Resource**: Relation + + # Conditions + + **Permission** view work packages + readOnly: true + revisions: + allOf: + - $ref: "./link.yml" + - description: |- + Revisions that are referencing the work package + + **Resource**: Revision + + # Conditions + + **Permission** view changesets + readOnly: true + status: + allOf: + - $ref: "./link.yml" + - description: |- + The current status of the work package + + **Resource**: Status + timeEntries: + allOf: + - $ref: "./link.yml" + - description: |- + All time entries logged on the work package. Please note that this is a link to an HTML resource for now and as such, the link is subject to change. + + **Resource**: N/A + + # Conditions + + **Permission** view time entries + readOnly: true + type: + allOf: + - $ref: "./link.yml" + - description: |- + The type of the work package + + **Resource**: Type + version: + allOf: + - $ref: "./link.yml" + - description: |- + The version associated to the work package + + **Resource**: Version + watchers: + allOf: + - $ref: "./link.yml" + - description: |- + All users that are currently watching this work package + + **Resource**: Collection + + # Conditions + + **Permission** view work package watchers + readOnly: true example: _type: WorkPackage diff --git a/docs/api/apiv3/components/schemas/workspaces_schema_model.yml b/docs/api/apiv3/components/schemas/workspaces_schema_model.yml index 362ed732de7a..3ecfab3bccac 100644 --- a/docs/api/apiv3/components/schemas/workspaces_schema_model.yml +++ b/docs/api/apiv3/components/schemas/workspaces_schema_model.yml @@ -93,6 +93,11 @@ properties: href: type: string example: "/api/v3/workspaces/schema" +patternProperties: + "^customField\\d+$": + $ref: './schema_property_model.yml' + "^customComment\\d+$": + $ref: './schema_property_model.yml' example: _type: Schema @@ -229,6 +234,12 @@ example: hasDefault: false writable: true visibility: default + customComment35: + type: String + name: Text project custom field comment + required: false + hasDefault: false + writable: true _links: self: href: "/api/v3/workspaces/schema" diff --git a/docs/api/apiv3/openapi-spec.yml b/docs/api/apiv3/openapi-spec.yml index 4e2ff787bbcd..91d141331ab9 100644 --- a/docs/api/apiv3/openapi-spec.yml +++ b/docs/api/apiv3/openapi-spec.yml @@ -755,6 +755,8 @@ components: "$ref": "./components/schemas/project_configuration_model.yml" CustomActionModel: "$ref": "./components/schemas/custom_action_model.yml" + CustomCommentProperties: + "$ref": "./components/schemas/custom_comment_properties.yml" CustomFieldLinkedProperties: "$ref": "./components/schemas/custom_field_linked_properties.yml" CustomFieldProperties: diff --git a/docs/system-admin-guide/system-settings/external-links/README.md b/docs/system-admin-guide/system-settings/external-links/README.md index be77605c03dd..6253afa25980 100644 --- a/docs/system-admin-guide/system-settings/external-links/README.md +++ b/docs/system-admin-guide/system-settings/external-links/README.md @@ -12,14 +12,21 @@ You can configure how OpenProject handles **external links** in formatted text ( ## Enable external link capture -To enable the Capture external links setting navigate to *Administration ->System settings -> External links* and check the **Capture external links** option. Don't forget to save your changes. +To enable the Capture external links setting navigate to *Administration → System settings → External links*. Here you can enable the following settings: + +- **Capture external links**: when this option is turned on, all outbound links in formatted text will first lead to a warning page before users leave the application. +- **Require users to be logged in**: when enabled, users must sign in before they can proceed to any external website. + +Don't forget to save your changes.  -Once enabled, OpenProject will redirect external links in formatted text through a warning page. +Once *Capturing external links* is enabled, OpenProject will redirect external links in formatted text through a warning page. Here is an example of a warning page:  +If the requirement to be logged in is activated and users are not logged in, they will first be redirected to the login page. + ## What is an external link? Links are considered external if they: diff --git a/docs/system-admin-guide/system-settings/external-links/openproject_system_admin_guide_external_links.png b/docs/system-admin-guide/system-settings/external-links/openproject_system_admin_guide_external_links.png index fee15cac6619..a2aba6884020 100644 Binary files a/docs/system-admin-guide/system-settings/external-links/openproject_system_admin_guide_external_links.png and b/docs/system-admin-guide/system-settings/external-links/openproject_system_admin_guide_external_links.png differ diff --git a/docs/user-guide/agile-boards/README.md b/docs/user-guide/agile-boards/README.md index 7416fb5247ce..ab47d3320ca3 100644 --- a/docs/user-guide/agile-boards/README.md +++ b/docs/user-guide/agile-boards/README.md @@ -69,15 +69,15 @@ After [adding lists to your board](#add-lists-to-your-board) they will automatic There are several **types of Action boards** available in OpenProject: -### Status board +### Kanban board Each list represents a status. That means that all work packages with the status "New" will be automatically displayed in the column "New". -When creating a new Status board a list of all work packages in the default status (usually this is the status "New") will be added automatically, while additional lists need to be added manually. +When creating a new Kanban board a list of all work packages in the default status (usually this is the status "New") will be added automatically, while additional lists need to be added manually. > [!TIP] > You can not move work packages from or to every status. Please find out more about the [workflow rules and restrictions here](../../system-admin-guide/manage-work-packages/work-package-workflows/). - + ### Assignee board diff --git a/docs/user-guide/agile-boards/choose-board-type.png b/docs/user-guide/agile-boards/choose-board-type.png index 77619412aa0b..de67a698e5d9 100644 Binary files a/docs/user-guide/agile-boards/choose-board-type.png and b/docs/user-guide/agile-boards/choose-board-type.png differ diff --git a/docs/user-guide/agile-boards/create-a-new-board-in-the-boards-module.png b/docs/user-guide/agile-boards/create-a-new-board-in-the-boards-module.png index 2a5a7c846176..ae91b4750fd1 100644 Binary files a/docs/user-guide/agile-boards/create-a-new-board-in-the-boards-module.png and b/docs/user-guide/agile-boards/create-a-new-board-in-the-boards-module.png differ diff --git a/docs/user-guide/agile-boards/openproject_userguide_boards_kanban.png b/docs/user-guide/agile-boards/openproject_userguide_boards_kanban.png new file mode 100644 index 000000000000..ad9c887881d4 Binary files /dev/null and b/docs/user-guide/agile-boards/openproject_userguide_boards_kanban.png differ diff --git a/docs/user-guide/agile-boards/openproject_userguide_boards_overview.png b/docs/user-guide/agile-boards/openproject_userguide_boards_overview.png index 98cd29479e09..4b688a5e80cb 100644 Binary files a/docs/user-guide/agile-boards/openproject_userguide_boards_overview.png and b/docs/user-guide/agile-boards/openproject_userguide_boards_overview.png differ diff --git a/docs/user-guide/project-home/project-widgets/README.md b/docs/user-guide/project-home/project-widgets/README.md index 468ba9f333cc..4fbec4d27f9f 100644 --- a/docs/user-guide/project-home/project-widgets/README.md +++ b/docs/user-guide/project-home/project-widgets/README.md @@ -31,6 +31,7 @@ Click the **+** icon and choose which kind of widget you want to add. You can add various widgets to your project dashboard. Available widgets in OpenProject include: +- Budget - Calendar - Custom text - Description @@ -44,6 +45,8 @@ You can add various widgets to your project dashboard. Available widgets in Open - Work packages overview - Work packages table +### Budget widget + ### Calendar widget The calendar widget displays your current work packages in a calendar. It shows work packages that are being worked on at the current date. The maximum number of displayable work packages is 100. diff --git a/modules/meeting/app/components/meeting_agenda_items/blank_slate_component.rb b/modules/meeting/app/components/meeting_agenda_items/blank_slate_component.rb index be81cccce94e..088f46cf2326 100644 --- a/modules/meeting/app/components/meeting_agenda_items/blank_slate_component.rb +++ b/modules/meeting/app/components/meeting_agenda_items/blank_slate_component.rb @@ -58,7 +58,7 @@ def description if series_template? t(:"recurring_meeting.template.description") elsif onetime_template? - t(:text_onetime_meeting_template_description) + t(:text_onetime_meeting_template_empty_description) else t(%i[text_meeting_empty_description1 text_meeting_empty_description2]).join(" ") end diff --git a/modules/meeting/app/components/meetings/header_component.html.erb b/modules/meeting/app/components/meetings/header_component.html.erb index 97c39222044f..d3aa26cc5be1 100644 --- a/modules/meeting/app/components/meetings/header_component.html.erb +++ b/modules/meeting/app/components/meetings/header_component.html.erb @@ -41,7 +41,7 @@ if create_from_template_enabled? header.with_action_button(**create_from_template_button_params) do |button| button.with_leading_visual_icon(icon: :plus) - I18n.t("label_meeting_create_from_template") + I18n.t("label_meeting") end end diff --git a/modules/meeting/app/components/meetings/header_component.rb b/modules/meeting/app/components/meetings/header_component.rb index d559e107a4ba..22e131144371 100644 --- a/modules/meeting/app/components/meetings/header_component.rb +++ b/modules/meeting/app/components/meetings/header_component.rb @@ -102,12 +102,14 @@ def create_from_template_enabled? def create_from_template_button_params { tag: :a, - scheme: :primary, + scheme: :secondary, mobile_label: I18n.t("label_meeting_create_from_template"), mobile_icon: :plus, size: :medium, href: new_dialog_project_meetings_path(@project, template_id: @meeting.id), - data: { turbo_stream: true } + id: "create-meeting-from-template", + data: { turbo_stream: true }, + aria: { label: I18n.t("label_meeting_create_from_template") } } end diff --git a/modules/meeting/app/components/meetings/index/form_component.html.erb b/modules/meeting/app/components/meetings/index/form_component.html.erb index f889b28fca83..b6243a47c4e3 100644 --- a/modules/meeting/app/components/meetings/index/form_component.html.erb +++ b/modules/meeting/app/components/meetings/index/form_component.html.erb @@ -31,7 +31,7 @@ if @project.nil? modal_body.with_row(mb: 3) do - render(Meeting::ProjectAutocompleter.new(f)) + render(Meeting::ProjectAutocompleter.new(f, meeting: @meeting)) end end diff --git a/modules/meeting/app/forms/meeting/project_autocompleter.rb b/modules/meeting/app/forms/meeting/project_autocompleter.rb index 252adf96facd..e0488d266bb8 100644 --- a/modules/meeting/app/forms/meeting/project_autocompleter.rb +++ b/modules/meeting/app/forms/meeting/project_autocompleter.rb @@ -34,6 +34,7 @@ class Meeting::ProjectAutocompleter < ApplicationForm id: "project_id", label: Project.model_name.human, required: true, + caption:, autocomplete_options: { with_search_icon: true, openDirectly: false, @@ -47,4 +48,16 @@ class Meeting::ProjectAutocompleter < ApplicationForm } ) end + + def initialize(meeting:) + super() + + @meeting = meeting + end + + def caption + return if @meeting.is_a?(RecurringMeeting) + + @meeting.onetime_template? ? I18n.t("caption_template_project_select") : nil + end end diff --git a/modules/meeting/config/locales/crowdin/af.yml b/modules/meeting/config/locales/crowdin/af.yml index 73c81ba665f1..6fdedae06497 100644 --- a/modules/meeting/config/locales/crowdin/af.yml +++ b/modules/meeting/config/locales/crowdin/af.yml @@ -126,7 +126,6 @@ af: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ af: label_time_zone: "Tydsone" label_start_date: "Begindatum" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ af: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ar.yml b/modules/meeting/config/locales/crowdin/ar.yml index a5be635bc4c4..01a60b1f048a 100644 --- a/modules/meeting/config/locales/crowdin/ar.yml +++ b/modules/meeting/config/locales/crowdin/ar.yml @@ -134,7 +134,6 @@ ar: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "اجتماع جديد" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -215,6 +214,8 @@ ar: label_time_zone: "المنطقة الزمنية" label_start_date: "تاريخ البدء" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -641,7 +642,7 @@ ar: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/az.yml b/modules/meeting/config/locales/crowdin/az.yml index 625bfe211748..a17ea75ee84e 100644 --- a/modules/meeting/config/locales/crowdin/az.yml +++ b/modules/meeting/config/locales/crowdin/az.yml @@ -126,7 +126,6 @@ az: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ az: label_time_zone: "Time zone" label_start_date: "Start date" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ az: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/be.yml b/modules/meeting/config/locales/crowdin/be.yml index 3ef8fdca9d5c..fc460aeee00b 100644 --- a/modules/meeting/config/locales/crowdin/be.yml +++ b/modules/meeting/config/locales/crowdin/be.yml @@ -130,7 +130,6 @@ be: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -205,6 +204,8 @@ be: label_time_zone: "Time zone" label_start_date: "Start date" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -627,7 +628,7 @@ be: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/bg.yml b/modules/meeting/config/locales/crowdin/bg.yml index 40e900a45ecc..42ad60b58772 100644 --- a/modules/meeting/config/locales/crowdin/bg.yml +++ b/modules/meeting/config/locales/crowdin/bg.yml @@ -126,7 +126,6 @@ bg: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Нова среща" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ bg: label_time_zone: "Часова зона" label_start_date: "Начална дата" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ bg: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ca.yml b/modules/meeting/config/locales/crowdin/ca.yml index 3a2048577d55..acf2a23f64fd 100644 --- a/modules/meeting/config/locales/crowdin/ca.yml +++ b/modules/meeting/config/locales/crowdin/ca.yml @@ -126,7 +126,6 @@ ca: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Nova reunió" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ ca: label_time_zone: "Zona horària" label_start_date: "Data d'inici" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ ca: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ckb-IR.yml b/modules/meeting/config/locales/crowdin/ckb-IR.yml index 82a4700edd3b..ce28e54db24b 100644 --- a/modules/meeting/config/locales/crowdin/ckb-IR.yml +++ b/modules/meeting/config/locales/crowdin/ckb-IR.yml @@ -126,7 +126,6 @@ ckb-IR: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ ckb-IR: label_time_zone: "Time zone" label_start_date: "Start date" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ ckb-IR: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index 3420c4913d07..e06c99426271 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -130,7 +130,6 @@ cs: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Nová schůzka" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Nová jednorázová schůzka" label_meeting_new_recurring: "Nová opakovaná schůzka" label_meeting_create: "Vytvořit schůzku" @@ -205,6 +204,8 @@ cs: label_time_zone: "Časové pásmo" label_start_date: "Datum zahájení" label_subscribe_icalendar: "Přihlásit kalendář k odběru" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -627,7 +628,7 @@ cs: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/da.yml b/modules/meeting/config/locales/crowdin/da.yml index ad970b4f1812..1c93c068c16b 100644 --- a/modules/meeting/config/locales/crowdin/da.yml +++ b/modules/meeting/config/locales/crowdin/da.yml @@ -126,7 +126,6 @@ da: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Nyt møde" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ da: label_time_zone: "Tidszone" label_start_date: "Start dato" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ da: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index a65e00d18a41..3f76f579fbf3 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -126,7 +126,6 @@ de: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Neue Besprechung" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Neue einmalige Besprechung" label_meeting_new_recurring: "Neue Terminserie" label_meeting_create: "Besprechung erstellen" @@ -195,6 +194,8 @@ de: label_time_zone: "Zeitzone" label_start_date: "Beginn" label_subscribe_icalendar: "Im Kalender abonnieren" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ de: text_meeting_draft_banner: "Dieses Meeting ist derzeit ein Entwurf. Diese Besprechung sendet keine Kalenderaktualisierungen oder Einladungen, selbst wenn Sie Besprechungsdetails ändern oder Teilnehmer hinzufügen/entfernen." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Diese Besprechung öffnen und Einladungen verschicken?" text_exit_draft_mode_dialog_subtitle: "Sie können nicht mehr zum Entwurfsmodus zurückkehren, sobald Sie die Besprechung eröffnen." text_exit_draft_mode_dialog_template_title: "Das erste Vorkommen dieser Terminserie öffnen?" diff --git a/modules/meeting/config/locales/crowdin/el.yml b/modules/meeting/config/locales/crowdin/el.yml index bdc82fb90ccb..50dc9392b83e 100644 --- a/modules/meeting/config/locales/crowdin/el.yml +++ b/modules/meeting/config/locales/crowdin/el.yml @@ -126,7 +126,6 @@ el: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Νέα Συνάντηση" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Δημιουργία συνάντησης" @@ -195,6 +194,8 @@ el: label_time_zone: "Ζώνη Ώρας" label_start_date: "Ημερομηνία έναρξης" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ el: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/eo.yml b/modules/meeting/config/locales/crowdin/eo.yml index 6014ac200ca9..6a0f507a9e58 100644 --- a/modules/meeting/config/locales/crowdin/eo.yml +++ b/modules/meeting/config/locales/crowdin/eo.yml @@ -126,7 +126,6 @@ eo: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Nova renkontiĝo" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ eo: label_time_zone: "Horzono" label_start_date: "Komencdato" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ eo: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml index 7beca91e01be..7bcd99b2ebcb 100644 --- a/modules/meeting/config/locales/crowdin/es.yml +++ b/modules/meeting/config/locales/crowdin/es.yml @@ -126,7 +126,6 @@ es: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Nueva reunión" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Nueva reunión única" label_meeting_new_recurring: "Nueva reunión periódica" label_meeting_create: "Crear reunión" @@ -195,6 +194,8 @@ es: label_time_zone: "Zona horaria" label_start_date: "Fecha de inicio" label_subscribe_icalendar: "Suscribirse al calendario" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ es: text_meeting_draft_banner: "Estás en modo Borrador. Esta reunión no enviará actualizaciones ni invitaciones de calendario, incluso si cambias los detalles de la reunión o añades/eliminas participantes." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "¿Abrir esta reunión y enviar invitaciones?" text_exit_draft_mode_dialog_subtitle: "Una vez programada una reunión, no puedes volver al modo Borrador." text_exit_draft_mode_dialog_template_title: "¿Abrir la primera repetición de esta serie de reuniones?" diff --git a/modules/meeting/config/locales/crowdin/et.yml b/modules/meeting/config/locales/crowdin/et.yml index 4abace527dd9..dd2123de87e4 100644 --- a/modules/meeting/config/locales/crowdin/et.yml +++ b/modules/meeting/config/locales/crowdin/et.yml @@ -126,7 +126,6 @@ et: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Uus koosolek" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ et: label_time_zone: "Ajavöönd" label_start_date: "Alguskuupäev" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ et: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/eu.yml b/modules/meeting/config/locales/crowdin/eu.yml index 5b03636da211..cea506922d63 100644 --- a/modules/meeting/config/locales/crowdin/eu.yml +++ b/modules/meeting/config/locales/crowdin/eu.yml @@ -126,7 +126,6 @@ eu: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Hitzordu berria" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ eu: label_time_zone: "Ordu-eremua" label_start_date: "Hasiera data" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ eu: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/fa.yml b/modules/meeting/config/locales/crowdin/fa.yml index 6bbe1eebba37..a0207f78ca31 100644 --- a/modules/meeting/config/locales/crowdin/fa.yml +++ b/modules/meeting/config/locales/crowdin/fa.yml @@ -126,7 +126,6 @@ fa: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "ایجاد جلسه" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ fa: label_time_zone: "منطقه زمانی" label_start_date: "تاریخ شروع" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ fa: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/fi.yml b/modules/meeting/config/locales/crowdin/fi.yml index 04bf03e00672..3d6caee31126 100644 --- a/modules/meeting/config/locales/crowdin/fi.yml +++ b/modules/meeting/config/locales/crowdin/fi.yml @@ -126,7 +126,6 @@ fi: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Uusi kokous" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ fi: label_time_zone: "Aikavyöhyke" label_start_date: "Aloituspäivä" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ fi: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/fil.yml b/modules/meeting/config/locales/crowdin/fil.yml index a95839c0f439..87115689c258 100644 --- a/modules/meeting/config/locales/crowdin/fil.yml +++ b/modules/meeting/config/locales/crowdin/fil.yml @@ -126,7 +126,6 @@ fil: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Bagong Pagpupulong" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ fil: label_time_zone: "Time Zone" label_start_date: "Petsa ng Pagsisimula" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ fil: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/he.yml b/modules/meeting/config/locales/crowdin/he.yml index 27212c1c64b2..0c6c1ea40ea5 100644 --- a/modules/meeting/config/locales/crowdin/he.yml +++ b/modules/meeting/config/locales/crowdin/he.yml @@ -130,7 +130,6 @@ he: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "פגישה חדשה" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -205,6 +204,8 @@ he: label_time_zone: "איזור זמן" label_start_date: "תאריך התחלה" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -627,7 +628,7 @@ he: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/hi.yml b/modules/meeting/config/locales/crowdin/hi.yml index cc91f666bba6..fafe394fc0a1 100644 --- a/modules/meeting/config/locales/crowdin/hi.yml +++ b/modules/meeting/config/locales/crowdin/hi.yml @@ -126,7 +126,6 @@ hi: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ hi: label_time_zone: "समय क्षेत्र" label_start_date: "प्रारंभ दिनांक" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ hi: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/hr.yml b/modules/meeting/config/locales/crowdin/hr.yml index c238623014c6..6ebf9bd57e0d 100644 --- a/modules/meeting/config/locales/crowdin/hr.yml +++ b/modules/meeting/config/locales/crowdin/hr.yml @@ -128,7 +128,6 @@ hr: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Novi sastanak" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -200,6 +199,8 @@ hr: label_time_zone: "Vremenska zona" label_start_date: "Datum Početka" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -620,7 +621,7 @@ hr: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/hu.yml b/modules/meeting/config/locales/crowdin/hu.yml index ccadd388ecab..f5e69bfeb6c1 100644 --- a/modules/meeting/config/locales/crowdin/hu.yml +++ b/modules/meeting/config/locales/crowdin/hu.yml @@ -126,7 +126,6 @@ hu: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Új megbeszélés" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Új egyszeri megbeszélés" label_meeting_new_recurring: "Új ismétlődő megbeszélés" label_meeting_create: "Megbeszélés létrehozása" @@ -195,6 +194,8 @@ hu: label_time_zone: "Időzóna" label_start_date: "Kezdési dátum" label_subscribe_icalendar: "Feliratkozás az iCalendars-ra" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ hu: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/id.yml b/modules/meeting/config/locales/crowdin/id.yml index 1f5d85bc19af..1ebe98f4ecaa 100644 --- a/modules/meeting/config/locales/crowdin/id.yml +++ b/modules/meeting/config/locales/crowdin/id.yml @@ -124,7 +124,6 @@ id: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Rapat Baru" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Rapat satu waktu baru" label_meeting_new_recurring: "Rapat berulang baru" label_meeting_create: "Buat rapat" @@ -190,6 +189,8 @@ id: label_time_zone: "Zona waktu" label_start_date: "Tanggal mulai" label_subscribe_icalendar: "Langganan ke kalender" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -606,7 +607,7 @@ id: text_meeting_draft_banner: "Saat ini, Anda berada dalam mode draf. Rapat ini tidak akan mengirimkan pembaruan kalender atau undangan, bahkan jika Anda mengubah detail rapat atau menambahkan/menghapus peserta." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Buka rapat ini dan kirim undangan?" text_exit_draft_mode_dialog_subtitle: "Anda tidak dapat kembali ke mode draf setellah Anda menjadwalkan rapat." text_exit_draft_mode_dialog_template_title: "Buka acara yang pertama dalam seri rapat ini?" diff --git a/modules/meeting/config/locales/crowdin/ja.yml b/modules/meeting/config/locales/crowdin/ja.yml index cecd9d8e3085..ebe15a4e53f2 100644 --- a/modules/meeting/config/locales/crowdin/ja.yml +++ b/modules/meeting/config/locales/crowdin/ja.yml @@ -124,7 +124,6 @@ ja: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "新しい会議" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "新しい一度限りの会議" label_meeting_new_recurring: "定期的な会議の作成" label_meeting_create: "会議を作成" @@ -190,6 +189,8 @@ ja: label_time_zone: "タイムゾーン" label_start_date: "開始日" label_subscribe_icalendar: "カレンダーを購読する" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -606,7 +607,7 @@ ja: text_meeting_draft_banner: "現在下書きモードです。 会議の詳細を変更したり出席者を追加/削除したりしても,この会議はカレンダーの更新や招待状を送信しません。" text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "この会議を開いて招待を送信しますか?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ka.yml b/modules/meeting/config/locales/crowdin/ka.yml index 875d2b9ef07a..2b3930e73bfe 100644 --- a/modules/meeting/config/locales/crowdin/ka.yml +++ b/modules/meeting/config/locales/crowdin/ka.yml @@ -126,7 +126,6 @@ ka: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "ახალი შეხვედრა" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ ka: label_time_zone: "დროის სარტყელი" label_start_date: "დაწყების თარიღი" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ ka: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/kk.yml b/modules/meeting/config/locales/crowdin/kk.yml index 9f09eb1c78c5..eb3c476208d6 100644 --- a/modules/meeting/config/locales/crowdin/kk.yml +++ b/modules/meeting/config/locales/crowdin/kk.yml @@ -126,7 +126,6 @@ kk: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ kk: label_time_zone: "Time zone" label_start_date: "Start date" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ kk: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/lt.yml b/modules/meeting/config/locales/crowdin/lt.yml index c8bee77b0754..9ed2501ffc6d 100644 --- a/modules/meeting/config/locales/crowdin/lt.yml +++ b/modules/meeting/config/locales/crowdin/lt.yml @@ -130,7 +130,6 @@ lt: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Naujas pasitarimas" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -205,6 +204,8 @@ lt: label_time_zone: "Laiko juosta" label_start_date: "Pradžios data" label_subscribe_icalendar: "Prenumeruoti kalendorių" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -627,7 +628,7 @@ lt: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/lv.yml b/modules/meeting/config/locales/crowdin/lv.yml index 1616f604b574..f61a95c05f6d 100644 --- a/modules/meeting/config/locales/crowdin/lv.yml +++ b/modules/meeting/config/locales/crowdin/lv.yml @@ -128,7 +128,6 @@ lv: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Jauna sanāksme" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Izveidot sanāksmi" @@ -200,6 +199,8 @@ lv: label_time_zone: "Laika josla" label_start_date: "Sākuma datums" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -620,7 +621,7 @@ lv: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/mn.yml b/modules/meeting/config/locales/crowdin/mn.yml index a6a1a5236bf8..e36707a31e8b 100644 --- a/modules/meeting/config/locales/crowdin/mn.yml +++ b/modules/meeting/config/locales/crowdin/mn.yml @@ -126,7 +126,6 @@ mn: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ mn: label_time_zone: "Time zone" label_start_date: "Start date" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ mn: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ms.yml b/modules/meeting/config/locales/crowdin/ms.yml index 93ab39142853..6896c316366a 100644 --- a/modules/meeting/config/locales/crowdin/ms.yml +++ b/modules/meeting/config/locales/crowdin/ms.yml @@ -124,7 +124,6 @@ ms: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Mesyuarat Baharu" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Mesyuarat baru sekali" label_meeting_new_recurring: "Mesyuarat berulang yang baru" label_meeting_create: "Buat mesyuarat" @@ -190,6 +189,8 @@ ms: label_time_zone: "Zon waktu" label_start_date: "Tarikh mula" label_subscribe_icalendar: "Langgan kalendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -606,7 +607,7 @@ ms: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ne.yml b/modules/meeting/config/locales/crowdin/ne.yml index 9f87ad11114b..71a4e46aaf1b 100644 --- a/modules/meeting/config/locales/crowdin/ne.yml +++ b/modules/meeting/config/locales/crowdin/ne.yml @@ -126,7 +126,6 @@ ne: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ ne: label_time_zone: "Time zone" label_start_date: "Start date" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ ne: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/nl.yml b/modules/meeting/config/locales/crowdin/nl.yml index 8244a3e290c5..5c61689c80dc 100644 --- a/modules/meeting/config/locales/crowdin/nl.yml +++ b/modules/meeting/config/locales/crowdin/nl.yml @@ -126,7 +126,6 @@ nl: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Nieuwe vergadering" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Nieuwe eenmalige vergadering" label_meeting_new_recurring: "Nieuwe terugkerende vergadering" label_meeting_create: "Creëer vergadering" @@ -195,6 +194,8 @@ nl: label_time_zone: "Tijdzone" label_start_date: "Startdatum" label_subscribe_icalendar: "Abonneren op agenda" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ nl: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/no.yml b/modules/meeting/config/locales/crowdin/no.yml index 43d9628a6578..f1e847905892 100644 --- a/modules/meeting/config/locales/crowdin/no.yml +++ b/modules/meeting/config/locales/crowdin/no.yml @@ -126,7 +126,6 @@ label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Nytt møte" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ label_time_zone: "Tidssone" label_start_date: "Startdato" label_subscribe_icalendar: "Abonner på kalender" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/pl.yml b/modules/meeting/config/locales/crowdin/pl.yml index 8ea02388ab9e..ec18b5c45c40 100644 --- a/modules/meeting/config/locales/crowdin/pl.yml +++ b/modules/meeting/config/locales/crowdin/pl.yml @@ -130,7 +130,6 @@ pl: label_meeting_template_edit: "Edytuj szablon" label_meeting_create_from_template: "Utwórz spotkanie z szablonu" label_meeting_new: "Nowe spotkanie" - caption_meeting_template_select: "Wybierz szablon, aby automatycznie skopiować z niego punkty planu spotkania" label_meeting_new_dynamic: "Nowe spotkanie jednorazowe" label_meeting_new_recurring: "Nowe spotkanie cykliczne" label_meeting_create: "Utwórz spotkanie" @@ -205,6 +204,8 @@ pl: label_time_zone: "Strefa czasowa" label_start_date: "Data rozpoczęcia" label_subscribe_icalendar: "Subskrybuj kalendarz" + caption_meeting_template_select: "Wybierz szablon, aby automatycznie skopiować z niego punkty planu spotkania" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -627,7 +628,7 @@ pl: text_meeting_draft_banner: "Jesteś teraz w trybie wersji roboczej. To spotkanie nie wyśle żadnych aktualizacji kalendarza ani zaproszeń, nawet jeśli zmienisz szczegóły spotkania lub dodasz/usuniesz uczestników." text_onetime_meeting_template_banner: "Obecnie edytujesz szablon spotkania. Możesz użyć tego szablonu do tworzenia jednorazowych spotkań z predefiniowanym planem spotkania. Zmiany nie będą miały wpływu na już utworzone spotkania." text_onetime_meeting_template_empty_heading: "Ten szablon spotkania jest pusty" - text_onetime_meeting_template_description: "Dodaj punkty planu spotkania i załączniki do tego szablonu. Będą one dołączane do każdego spotkania opartego na tym szablonie." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Otworzyć to spotkanie i wysłać zaproszenia?" text_exit_draft_mode_dialog_subtitle: "Po zaplanowaniu spotkania nie można powrócić do trybu wersji roboczej." text_exit_draft_mode_dialog_template_title: "Otworzyć pierwsze wystąpienie z tej serii spotkań?" diff --git a/modules/meeting/config/locales/crowdin/pt-PT.yml b/modules/meeting/config/locales/crowdin/pt-PT.yml index 224a445c7400..d4bc3db52aae 100644 --- a/modules/meeting/config/locales/crowdin/pt-PT.yml +++ b/modules/meeting/config/locales/crowdin/pt-PT.yml @@ -126,7 +126,6 @@ pt-PT: label_meeting_template_edit: "Editar modelo" label_meeting_create_from_template: "Criar reunião a partir de modelo" label_meeting_new: "Nova reunião" - caption_meeting_template_select: "Selecione um modelo para copiar automaticamente os seus pontos da agenda" label_meeting_new_dynamic: "Nova reunião única" label_meeting_new_recurring: "Nova reunião recorrente" label_meeting_create: "Criar reunião" @@ -195,6 +194,8 @@ pt-PT: label_time_zone: "Fuso horário" label_start_date: "Data de início" label_subscribe_icalendar: "Subscrever o calendário" + caption_meeting_template_select: "Selecione um modelo para copiar automaticamente os seus pontos da agenda" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ pt-PT: text_meeting_draft_banner: "Está no modo de rascunho. Esta reunião não enviará atualizações de calendário ou convites, mesmo que altere os detalhes da reunião ou adicione/remova participantes." text_onetime_meeting_template_banner: "Está a editar um modelo de reunião. Pode utilizar este modelo para criar reuniões únicas com uma agenda predefinida. As alterações não afetarão as reuniões já criadas." text_onetime_meeting_template_empty_heading: "Este modelo de reunião está vazio" - text_onetime_meeting_template_description: "Adicione elementos da agenda e anexos a este modelo. Serão incluídos em todas as reuniões com base neste modelo." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Abrir esta reunião e enviar convites?" text_exit_draft_mode_dialog_subtitle: "Não pode regressar ao modo de rascunho após agendar uma reunião." text_exit_draft_mode_dialog_template_title: "Abrir a primeira ocorrência desta série de reuniões?" diff --git a/modules/meeting/config/locales/crowdin/ro.yml b/modules/meeting/config/locales/crowdin/ro.yml index 01ca73393d37..5ad3e74bfa07 100644 --- a/modules/meeting/config/locales/crowdin/ro.yml +++ b/modules/meeting/config/locales/crowdin/ro.yml @@ -128,7 +128,6 @@ ro: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Noua întâlnire" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "Întâlnire periodică nouă" label_meeting_create: "Creează întâlnire" @@ -200,6 +199,8 @@ ro: label_time_zone: "Fus orar" label_start_date: "Dată început" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -620,7 +621,7 @@ ro: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index a3df551cf310..bd5e282c0193 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -130,7 +130,6 @@ ru: label_meeting_template_edit: "Редактировать шаблон" label_meeting_create_from_template: "Создать встречу из шаблона" label_meeting_new: "Новое совещание" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Новое однократное совещание" label_meeting_new_recurring: "Новое повторяющееся совещание" label_meeting_create: "Создать совещание" @@ -205,6 +204,8 @@ ru: label_time_zone: "Часовой пояс" label_start_date: "Дата начала" label_subscribe_icalendar: "Подписаться на календарь" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -627,7 +628,7 @@ ru: text_meeting_draft_banner: "В настоящее время Вы находитесь в режиме черновика. Это совещание не будет рассылать никаких обновлений календаря или приглашений, даже если Вы измените детали совещания или добавите/удалите участников." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Открыть это совещание и разослать приглашения?" text_exit_draft_mode_dialog_subtitle: "Вы не можете вернуться в режим черновика после того, как запланировали совещание." text_exit_draft_mode_dialog_template_title: "Открыть первое совещание из этой серии?" diff --git a/modules/meeting/config/locales/crowdin/rw.yml b/modules/meeting/config/locales/crowdin/rw.yml index 7950404c9c2b..74cd8cb745d8 100644 --- a/modules/meeting/config/locales/crowdin/rw.yml +++ b/modules/meeting/config/locales/crowdin/rw.yml @@ -126,7 +126,6 @@ rw: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ rw: label_time_zone: "Time zone" label_start_date: "Start date" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ rw: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/si.yml b/modules/meeting/config/locales/crowdin/si.yml index a0730a1d7729..61003981c93b 100644 --- a/modules/meeting/config/locales/crowdin/si.yml +++ b/modules/meeting/config/locales/crowdin/si.yml @@ -126,7 +126,6 @@ si: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ si: label_time_zone: "වේලා කලාපය" label_start_date: "ආරම්භක දිනය" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ si: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/sk.yml b/modules/meeting/config/locales/crowdin/sk.yml index 4c5a7ba0576a..30f9dd468248 100644 --- a/modules/meeting/config/locales/crowdin/sk.yml +++ b/modules/meeting/config/locales/crowdin/sk.yml @@ -130,7 +130,6 @@ sk: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Nové stretnutie" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -205,6 +204,8 @@ sk: label_time_zone: "Časové pásmo" label_start_date: "Dátum začiatku" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -627,7 +628,7 @@ sk: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/sl.yml b/modules/meeting/config/locales/crowdin/sl.yml index 2f5e8c65f2af..2703081ec7ba 100644 --- a/modules/meeting/config/locales/crowdin/sl.yml +++ b/modules/meeting/config/locales/crowdin/sl.yml @@ -130,7 +130,6 @@ sl: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Nov sestanek" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -205,6 +204,8 @@ sl: label_time_zone: "Časovni pas" label_start_date: "Datum začetka" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -627,7 +628,7 @@ sl: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/sr.yml b/modules/meeting/config/locales/crowdin/sr.yml index eb77c19cedf9..ee7e301be47a 100644 --- a/modules/meeting/config/locales/crowdin/sr.yml +++ b/modules/meeting/config/locales/crowdin/sr.yml @@ -128,7 +128,6 @@ sr: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -200,6 +199,8 @@ sr: label_time_zone: "Time zone" label_start_date: "Start date" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -620,7 +621,7 @@ sr: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/sv.yml b/modules/meeting/config/locales/crowdin/sv.yml index 3581dd14f11c..75410f70c815 100644 --- a/modules/meeting/config/locales/crowdin/sv.yml +++ b/modules/meeting/config/locales/crowdin/sv.yml @@ -126,7 +126,6 @@ sv: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Nytt möte" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Nytt engångsmöte" label_meeting_new_recurring: "Nytt återkommande möte" label_meeting_create: "Skapa möte" @@ -195,6 +194,8 @@ sv: label_time_zone: "Tidszon" label_start_date: "Startdatum" label_subscribe_icalendar: "Prenumerera på kalender" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ sv: text_meeting_draft_banner: "Du befinner dig för närvarande i utkastläge. Det här mötet kommer inte att skicka ut några kalenderuppdateringar eller inbjudningar, även om du ändrar mötesdetaljer eller lägger till/tar bort deltagare." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Öppna detta möte och skicka inbjudningar?" text_exit_draft_mode_dialog_subtitle: "Du kan inte gå tillbaka till utkastet när du schemalägger ett möte." text_exit_draft_mode_dialog_template_title: "Öppna den första förekomsten av denna mötesserie?" diff --git a/modules/meeting/config/locales/crowdin/th.yml b/modules/meeting/config/locales/crowdin/th.yml index 604c0bd717d4..379be6c06382 100644 --- a/modules/meeting/config/locales/crowdin/th.yml +++ b/modules/meeting/config/locales/crowdin/th.yml @@ -124,7 +124,6 @@ th: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -190,6 +189,8 @@ th: label_time_zone: "โซนเวลา" label_start_date: "วันเริ่มต้น" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -606,7 +607,7 @@ th: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/tr.yml b/modules/meeting/config/locales/crowdin/tr.yml index 246ac3f00c82..c839a67802a9 100644 --- a/modules/meeting/config/locales/crowdin/tr.yml +++ b/modules/meeting/config/locales/crowdin/tr.yml @@ -126,7 +126,6 @@ tr: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Yeni Toplantı" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Tek seferlik yeni toplantı" label_meeting_new_recurring: "Yeni yinelenen toplantı" label_meeting_create: "Toplantı oluştur" @@ -195,6 +194,8 @@ tr: label_time_zone: "Saat dilim" label_start_date: "Başlama tarihi" label_subscribe_icalendar: "Takvime abone ol" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ tr: text_meeting_draft_banner: "Şu anda taslak modundasınız. Toplantı ayrıntılarını değiştirseniz veya katılımcı ekleyip çıkarsanız bile bu toplantı herhangi bir takvim güncellemesi veya davet göndermeyecektir." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Bu toplantıyı açıp davetiye gönderelim mi?" text_exit_draft_mode_dialog_subtitle: "Bir toplantı planladıktan sonra taslak moduna geri dönemezsiniz." text_exit_draft_mode_dialog_template_title: "Bu toplantı serisinin ilkini açar mısınız?" diff --git a/modules/meeting/config/locales/crowdin/uk.yml b/modules/meeting/config/locales/crowdin/uk.yml index 775ca627fd96..2609642c9070 100644 --- a/modules/meeting/config/locales/crowdin/uk.yml +++ b/modules/meeting/config/locales/crowdin/uk.yml @@ -130,7 +130,6 @@ uk: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Нова зустріч" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Нова одноразова нарада" label_meeting_new_recurring: "Нова повторювана нарада" label_meeting_create: "Створити нараду" @@ -205,6 +204,8 @@ uk: label_time_zone: "Часовий пояс" label_start_date: "Дата початку" label_subscribe_icalendar: "Підписатися на календар" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -627,7 +628,7 @@ uk: text_meeting_draft_banner: "Зараз ви працюєте в режимі чернетки: оновлення або запрошення з календаря не надсилатимуться щодо цієї наради, навіть якщо змінити її дані або додати/видалити учасників." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Відкрити цю нараду й надіслати запрошення?" text_exit_draft_mode_dialog_subtitle: "Запланувавши нараду, не можна повернутися в режим чернетки." text_exit_draft_mode_dialog_template_title: "Відкрити першу нараду цієї серії?" diff --git a/modules/meeting/config/locales/crowdin/uz.yml b/modules/meeting/config/locales/crowdin/uz.yml index 662e4a4ff30a..2e53f66911c6 100644 --- a/modules/meeting/config/locales/crowdin/uz.yml +++ b/modules/meeting/config/locales/crowdin/uz.yml @@ -126,7 +126,6 @@ uz: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -195,6 +194,8 @@ uz: label_time_zone: "Time zone" label_start_date: "Start date" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -613,7 +614,7 @@ uz: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/config/locales/crowdin/vi.yml b/modules/meeting/config/locales/crowdin/vi.yml index 4e630618beb0..1eb3bca9ba0b 100644 --- a/modules/meeting/config/locales/crowdin/vi.yml +++ b/modules/meeting/config/locales/crowdin/vi.yml @@ -124,7 +124,6 @@ vi: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "Cuộc họp mới" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "Cuộc họp một lần mới" label_meeting_new_recurring: "Cuộc họp định kỳ mới" label_meeting_create: "Tạo cuộc họp" @@ -190,6 +189,8 @@ vi: label_time_zone: "Múi giờ" label_start_date: "Ngày bắt đầu" label_subscribe_icalendar: "Đăng ký lịch" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -606,7 +607,7 @@ vi: text_meeting_draft_banner: "Bạn hiện đang ở chế độ nháp. Cuộc họp này sẽ không gửi bất kỳ cập nhật lịch hoặc lời mời nào, ngay cả khi bạn thay đổi chi tiết cuộc họp hoặc thêm/xóa người tham gia." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Mở cuộc họp này và gửi lời mời?" text_exit_draft_mode_dialog_subtitle: "Bạn không thể quay lại chế độ nháp sau khi lên lịch cuộc họp." text_exit_draft_mode_dialog_template_title: "Mở lần xuất hiện đầu tiên của chuỗi cuộc họp này?" diff --git a/modules/meeting/config/locales/crowdin/zh-TW.yml b/modules/meeting/config/locales/crowdin/zh-TW.yml index 5f179fd8a136..3c47a83f41cf 100644 --- a/modules/meeting/config/locales/crowdin/zh-TW.yml +++ b/modules/meeting/config/locales/crowdin/zh-TW.yml @@ -124,7 +124,6 @@ zh-TW: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "新增會議" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "建立一次性會議" label_meeting_new_recurring: "新的重複性會議" label_meeting_create: "新增會議" @@ -190,6 +189,8 @@ zh-TW: label_time_zone: "時區" label_start_date: "開始日期" label_subscribe_icalendar: "訂閱行事曆" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" meeting: participants: label: @@ -606,7 +607,7 @@ zh-TW: text_meeting_draft_banner: "您目前處於草稿模式。即使您變更會議詳細資訊或新增/移除參與者,此會議也不會傳送任何行事曆更新或邀請。" text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "開啟此會議並發送邀請函?" text_exit_draft_mode_dialog_subtitle: "一旦排定會議,就無法返回草稿模式。" text_exit_draft_mode_dialog_template_title: "要開啟此會議系列的第一場會議嗎?" diff --git a/modules/meeting/config/locales/en.yml b/modules/meeting/config/locales/en.yml index 89e4c92930f7..ba49af599b3b 100644 --- a/modules/meeting/config/locales/en.yml +++ b/modules/meeting/config/locales/en.yml @@ -143,7 +143,6 @@ en: label_meeting_template_edit: "Edit template" label_meeting_create_from_template: "Create meeting from template" label_meeting_new: "New Meeting" - caption_meeting_template_select: "Select a template to automatically copy its agenda items" label_meeting_new_dynamic: "New one-time meeting" label_meeting_new_recurring: "New recurring meeting" label_meeting_create: "Create meeting" @@ -213,6 +212,9 @@ en: label_start_date: "Start date" label_subscribe_icalendar: "Subscribe to calendar" + caption_meeting_template_select: "Select a template to automatically copy its agenda items" + caption_template_project_select: "Please select the project in which to create this meeting template" + meeting: participants: label: @@ -682,7 +684,7 @@ en: text_meeting_draft_banner: "You are currently in draft mode. This meeting will not send out any calendar updates or invites, even if you change meeting details or add/remove participants." text_onetime_meeting_template_banner: "You are currently editing a meeting template. You can use this template to create one-time meetings with a predefined agenda. Changes will not affect already-created meetings." text_onetime_meeting_template_empty_heading: "This meeting template is empty" - text_onetime_meeting_template_description: "Add agenda items and attachments to this template. They will be included in every meeting based on this template." + text_onetime_meeting_template_empty_description: "Add agenda items, sections and attachments here. They will be included in every meeting created using this template." text_exit_draft_mode_dialog_title: "Open this meeting and send invites?" text_exit_draft_mode_dialog_subtitle: "You cannot return to draft mode once you schedule a meeting." text_exit_draft_mode_dialog_template_title: "Open the first occurrence of this meeting series?" diff --git a/modules/meeting/spec/features/meeting_templates/create_meeting_from_template_spec.rb b/modules/meeting/spec/features/meeting_templates/create_meeting_from_template_spec.rb index abb6582ab304..fd6aa7e050f7 100644 --- a/modules/meeting/spec/features/meeting_templates/create_meeting_from_template_spec.rb +++ b/modules/meeting/spec/features/meeting_templates/create_meeting_from_template_spec.rb @@ -207,8 +207,8 @@ before { template_show_page.visit! } - it "does not show 'Create meeting from template' button" do - expect(page).to have_no_link("Create meeting from template") + it "does not show '+ Meeting' button" do + expect(page).to have_no_link(id: "create-meeting-from-template") end end end @@ -229,8 +229,8 @@ end it "can create a meeting from template page with button" do - expect(page).to have_link("Create meeting from template") - click_link "Create meeting from template" + expect(page).to have_link(id: "create-meeting-from-template") + click_link(id: "create-meeting-from-template") expect(page).to have_dialog("New one-time meeting") @@ -274,8 +274,8 @@ visit project_meeting_path(project, template) end - it "does not show 'Create meeting from template' button" do - expect(page).to have_no_link("Create meeting from template") + it "does not show the '+ Meeting' button" do + expect(page).to have_no_link(id: "create-meeting-from-template") end end @@ -290,8 +290,8 @@ visit project_meeting_path(project, template) end - it "shows 'Create meeting from template' button" do - expect(page).to have_link("Create meeting from template") + it "shows the '+ Meeting' button" do + expect(page).to have_link(id: "create-meeting-from-template") end end end diff --git a/spec/features/projects/creation_wizard/project_creation_wizard_spec.rb b/spec/features/projects/creation_wizard/project_creation_wizard_spec.rb index 5ae54f3daeda..90b1212ed284 100644 --- a/spec/features/projects/creation_wizard/project_creation_wizard_spec.rb +++ b/spec/features/projects/creation_wizard/project_creation_wizard_spec.rb @@ -132,11 +132,11 @@ create(:project_custom_field_project_mapping, project:, project_custom_field: string_custom_field) create(:project_custom_field_project_mapping, project:, project_custom_field: list_custom_field) create(:project_custom_field_project_mapping, project:, project_custom_field: int_custom_field) - - visit wizard_path end it "can visit the wizard path manually and navigate through sections" do + visit wizard_path + # Should show the wizard page with the first section expect(page).to have_css("h3", text: "Basic Information") expect(page).to have_text("Project Description") @@ -160,6 +160,8 @@ end it "shows different sections as separate pages" do + visit wizard_path + # First section expect(page).to have_css("h3", text: "Basic Information") expect(page).to have_text("Project Description") @@ -188,6 +190,8 @@ end it "displays and updates attribute help texts when focusing different fields" do + visit wizard_path + # Initially, help text for the first field should be visible expect(page).to have_text("Enter a detailed description of your project goals and objectives.") @@ -214,6 +218,8 @@ end it "updates and persists field values when clicking next" do + visit wizard_path + # Fill in fields in first section (Project Description is a textarea) text_field_editor.set_markdown "This is a test project for validation" fill_in "Project Code", with: "TEST-001" @@ -273,6 +279,8 @@ end it "shows completion checkmarks for sections with filled fields" do + visit wizard_path + # Initially, no checkmarks should be visible page.within(".op-projects-wizard--sidebar") do section_item = find("a", text: "Basic Information") @@ -298,6 +306,8 @@ end it "shows the correct last section behavior with Complete button" do + visit wizard_path + # Navigate to last section via sidebar click_link "Project Details" @@ -314,6 +324,8 @@ end it "can cancel and return to project overview" do + visit wizard_path + # Fill in some data fill_in "Project Code", with: "CANCEL-TEST" @@ -424,8 +436,49 @@ end it "denies access to the wizard" do + visit wizard_path + # Should show an error message about lacking permissions expect(page).to have_text("You are not authorized to access this page") end end + + context "with comments enabled for custom fields" do + before do + string_custom_field.update!(has_comment: true, is_required: true) + end + + it "remembers comment between page loads and saves it at the end" do + visit wizard_path + + # Fill comment, but not required description + fill_in "Project Code comment", with: "foo" + click_button "Continue" + wait_for_network_idle + expect(page).to have_field("Project Code comment", with: "foo") + + # Also fill description and go to next page + fill_in "Project Code", type: "text", with: "TEST-001" + click_button "Continue" + wait_for_network_idle + expect(page).to have_no_field("Project Code comment") + + # Check if first page still has comment + click_link "Back" + wait_for_network_idle + expect(page).to have_field("Project Code comment", with: "foo") + + # Finish the wizard + click_button "Continue" + wait_for_network_idle + select_autocomplete page.find("[data-custom-field-id='#{user_custom_field.id}']"), + results_selector: "body", + query: user_assignee.name + click_button "Complete" + wait_for_network_idle + + # Comment should be saved + expect(project.reload.send(string_custom_field.comment_attribute_name)).to eq "foo" + end + end end diff --git a/spec/features/projects/project_custom_fields/overview_page/dialog/attribute_help_texts_spec.rb b/spec/features/projects/project_custom_fields/overview_page/dialog/attribute_help_texts_spec.rb index a8a65487363b..d221d016c4e7 100644 --- a/spec/features/projects/project_custom_fields/overview_page/dialog/attribute_help_texts_spec.rb +++ b/spec/features/projects/project_custom_fields/overview_page/dialog/attribute_help_texts_spec.rb @@ -46,7 +46,7 @@ context "without attribute help texts defined" do it "shows field labels without help text link" do input_fields.each do |custom_field| - edit_dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + edit_dialog = overview_page.open_modal_for_custom_field(custom_field) edit_dialog.expect_title "Input fields" edit_dialog.expect_field_label_without_help_text custom_field.name edit_dialog.close @@ -65,7 +65,7 @@ it "shows field labels with help text link" do input_fields.each do |custom_field| - edit_dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + edit_dialog = overview_page.open_modal_for_custom_field(custom_field) edit_dialog.expect_title "Input fields" edit_dialog.expect_field_label_with_help_text custom_field.name edit_dialog.close @@ -74,7 +74,7 @@ context "without attachments" do it "shows help text modal on clicking help text link" do - edit_dialog = overview_page.open_edit_dialog_for_custom_field(date_project_custom_field) + edit_dialog = overview_page.open_modal_for_custom_field(date_project_custom_field) edit_dialog.expect_title "Input fields" edit_dialog.click_help_text_link_for_label "Date field" @@ -94,7 +94,7 @@ let!(:attachments) { create_list(:attachment, 2, container: integer_help_text) } it "shows help text modal, including attachments, on clicking help text link" do - edit_dialog = overview_page.open_edit_dialog_for_custom_field(integer_project_custom_field) + edit_dialog = overview_page.open_modal_for_custom_field(integer_project_custom_field) edit_dialog.expect_title "Input fields" edit_dialog.click_help_text_link_for_label "Integer field" @@ -128,7 +128,7 @@ context "without attribute help texts defined" do it "shows field labels without help text link" do select_fields.each do |custom_field| - edit_dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + edit_dialog = overview_page.open_modal_for_custom_field(custom_field) edit_dialog.expect_title "Select fields" edit_dialog.expect_field_label_without_help_text custom_field.name edit_dialog.close @@ -143,7 +143,7 @@ it "shows field labels with help text link" do select_fields.each do |custom_field| - edit_dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + edit_dialog = overview_page.open_modal_for_custom_field(custom_field) edit_dialog.expect_title "Select fields" edit_dialog.expect_field_label_with_help_text custom_field.name edit_dialog.close @@ -151,7 +151,7 @@ end it "shows help text modal on clicking help text link" do - edit_dialog = overview_page.open_edit_dialog_for_custom_field(user_project_custom_field) + edit_dialog = overview_page.open_modal_for_custom_field(user_project_custom_field) edit_dialog.expect_title "Select fields" edit_dialog.click_help_text_link_for_label "User field" @@ -171,7 +171,7 @@ context "without attribute help texts defined" do it "shows field labels without help text link" do multi_select_fields.each do |custom_field| - edit_dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + edit_dialog = overview_page.open_modal_for_custom_field(custom_field) edit_dialog.expect_title "Multi select fields" edit_dialog.expect_field_label_without_help_text custom_field.name edit_dialog.close @@ -192,7 +192,7 @@ it "shows field labels with help text link" do multi_select_fields.each do |custom_field| - edit_dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + edit_dialog = overview_page.open_modal_for_custom_field(custom_field) edit_dialog.expect_title "Multi select fields" edit_dialog.expect_field_label_with_help_text custom_field.name edit_dialog.close @@ -200,7 +200,7 @@ end it "shows help text modal on clicking help text link" do - edit_dialog = overview_page.open_edit_dialog_for_custom_field(multi_list_project_custom_field) + edit_dialog = overview_page.open_modal_for_custom_field(multi_list_project_custom_field) edit_dialog.expect_title "Multi select fields" edit_dialog.click_help_text_link_for_label "Multi list field" diff --git a/spec/features/projects/project_custom_fields/overview_page/dialog/inputs_spec.rb b/spec/features/projects/project_custom_fields/overview_page/dialog/inputs_spec.rb index 3b51779c5fb7..aae1607cc09f 100644 --- a/spec/features/projects/project_custom_fields/overview_page/dialog/inputs_spec.rb +++ b/spec/features/projects/project_custom_fields/overview_page/dialog/inputs_spec.rb @@ -35,18 +35,61 @@ include_context "with seeded projects, members and project custom fields" let(:overview_page) { Pages::Projects::Show.new(project) } + let(:user) { member_with_project_attributes_edit_permissions } before do - login_as member_with_project_attributes_edit_permissions + login_as user overview_page.visit_page end describe "with correct initialization and input behaviour" do + # not using let as dialog is closed every time, so new should be opened + def dialog = overview_page.open_modal_for_custom_field(custom_field) + + shared_examples "shows comment input only when comments are allowed by custom field" do + it "shows comment input only when comments are allowed by custom field" do + dialog.within_async_content(close_after_yield: true) do + expect(page).to have_no_field("Comment") + end + + custom_field.update!(has_comment: true) + + dialog.within_async_content(close_after_yield: true) do + expect(page).to have_field("Comment", with: "") + end + + create(:custom_comment, custom_field:, customized: project, text: "bar") + + dialog.within_async_content(close_after_yield: true) do + expect(page).to have_field("Comment", with: "bar") + end + end + end + + shared_examples "displays readonly modal for user without edit permission" do + let(:user) { member_without_project_attributes_edit_permissions } + let(:value_text) { expected_initial_value } + let(:value_expectation) { have_text(value_text) } + + it "opens show modal with readonly comment input and readonly custom field value" do + custom_field.update!(has_comment: true) + create(:custom_comment, custom_field:, customized: project, text: "baz") + refresh + + dialog.within_dialog(close_after_yield: true) do + overview_page.within_custom_field_container(custom_field) do + expect(page).to have_no_field(custom_field.name) + expect(page).to value_expectation + end + + expect(page).to have_field("Comment", with: "baz", readonly: true) + end + end + end + describe "with input fields" do shared_examples "a custom field checkbox" do it "shows the correct value if given" do - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - dialog.within_async_content(close_after_yield: true) do if expected_initial_value expect(page).to have_checked_field(custom_field.name) @@ -59,8 +102,6 @@ it "is unchecked if no value and no default value is given" do custom_field.custom_values.destroy_all - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - dialog.within_async_content(close_after_yield: true) do expect(page).to have_no_checked_field(custom_field.name) end @@ -71,26 +112,22 @@ custom_field.update!(default_value: true) - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - dialog.within_async_content(close_after_yield: true) do expect(page).to have_checked_field(custom_field.name) end custom_field.update!(default_value: false) - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - dialog.within_async_content(close_after_yield: true) do expect(page).to have_no_checked_field(custom_field.name) end end + + include_examples "shows comment input only when comments are allowed by custom field" end shared_examples "a custom field input" do it "shows the correct value if given" do - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - dialog.within_async_content(close_after_yield: true) do expect(page).to have_field(custom_field.name, with: expected_initial_value) end @@ -99,8 +136,6 @@ it "shows a blank input if no value or default value is given" do custom_field.custom_values.destroy_all - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - dialog.within_async_content(close_after_yield: true) do expect(page).to have_field(custom_field.name, with: expected_blank_value) end @@ -110,18 +145,16 @@ custom_field.custom_values.destroy_all custom_field.update!(default_value:) - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - dialog.within_async_content(close_after_yield: true) do expect(page).to have_field(custom_field.name, with: default_value) end end + + include_examples "shows comment input only when comments are allowed by custom field" end shared_examples "a rich text custom field input" do it "shows the correct value if given" do - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - dialog.within_async_content(close_after_yield: true) do field.expect_value(expected_initial_value) end @@ -130,8 +163,6 @@ it "shows a blank input if no value or default value is given" do custom_field.custom_values.destroy_all - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - dialog.within_async_content(close_after_yield: true) do field.expect_value(expected_blank_value) end @@ -141,12 +172,12 @@ custom_field.custom_values.destroy_all custom_field.update!(default_value:) - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - dialog.within_async_content(close_after_yield: true) do field.expect_value(default_value) end end + + include_examples "shows comment input only when comments are allowed by custom field" end describe "with boolean CF" do @@ -154,6 +185,10 @@ let(:expected_initial_value) { true } it_behaves_like "a custom field checkbox" + + it_behaves_like "displays readonly modal for user without edit permission" do + let(:value_text) { "Yes" } + end end describe "with string CF" do @@ -163,6 +198,8 @@ let(:expected_initial_value) { "Foo" } it_behaves_like "a custom field input" + + it_behaves_like "displays readonly modal for user without edit permission" end describe "with integer CF" do @@ -172,6 +209,8 @@ let(:expected_initial_value) { 123 } it_behaves_like "a custom field input" + + it_behaves_like "displays readonly modal for user without edit permission" end describe "with float CF" do @@ -181,6 +220,8 @@ let(:expected_initial_value) { 123.456 } it_behaves_like "a custom field input" + + it_behaves_like "displays readonly modal for user without edit permission" end describe "with date CF" do @@ -190,6 +231,10 @@ let(:expected_initial_value) { Date.new(2024, 1, 1) } it_behaves_like "a custom field input" + + it_behaves_like "displays readonly modal for user without edit permission" do + let(:value_text) { "01/01/2024" } + end end describe "with link CF" do @@ -206,6 +251,10 @@ expect(page).to have_link("https://www.openproject.org", href: "https://www.openproject.org") end end + + it_behaves_like "displays readonly modal for user without edit permission" do + let(:value_expectation) { have_link("https://www.openproject.org", href: "https://www.openproject.org") } + end end describe "with text CF" do @@ -216,39 +265,60 @@ let(:expected_initial_value) { "Lorem\nipsum" } # TBD: why is the second newline missing? it_behaves_like "a rich text custom field input" + + it_behaves_like "displays readonly modal for user without edit permission" do + let(:value_text) { "Lorem" } # only first line is shown + end end describe "with calculated value CFs" do - describe "using int" do - let(:custom_field) { calculated_from_int_project_custom_field } - let(:expected_blank_value) { "" } - let(:expected_initial_value) { 234 } - - it "shows the disabled input with the correct value if given" do - overview_page.within_project_attributes_sidebar do - overview_page.within_custom_field_container(custom_field) do - expect(page).to have_text(expected_initial_value) - end + let(:custom_field) { calculated_from_int_project_custom_field } + let(:expected_blank_value) { "" } + let(:expected_initial_value) { 234 } + + it "shows the disabled input with the correct value if given" do + overview_page.within_project_attributes_sidebar do + overview_page.within_custom_field_container(custom_field) do + expect(page).to have_text(expected_initial_value) end end + end - it "shows the disabled input with a blank value if no value is given" do - custom_field.custom_values.destroy_all + it "shows the disabled input with a blank value if no value is given" do + custom_field.custom_values.destroy_all - overview_page.within_project_attributes_sidebar do - overview_page.within_custom_field_container(custom_field) do - expect(page).to have_text(expected_blank_value) - end + overview_page.within_project_attributes_sidebar do + overview_page.within_custom_field_container(custom_field) do + expect(page).to have_text(expected_blank_value) end end end + + it "allows the modal only when comments are allowed by custom field" do + overview_page.expect_custom_field_without_modal_button(custom_field) + + custom_field.update!(has_comment: true) + refresh + + dialog.within_async_content(close_after_yield: true) do + expect(page).to have_field("Comment", with: "") + end + + create(:custom_comment, custom_field:, customized: project, text: "bar") + + dialog.within_async_content(close_after_yield: true) do + expect(page).to have_field("Comment", with: "bar") + end + end + + it_behaves_like "displays readonly modal for user without edit permission" end end describe "with single select fields" do - shared_examples "a autocomplete single select field" do + shared_examples "an autocomplete single select field" do it "shows the correct value if given" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.expect_selected(expected_initial_value) end @@ -256,13 +326,13 @@ it "shows a blank input if no value or default value is given" do custom_field.custom_values.destroy_all - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.expect_blank end it "filters the list based on the input" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search(second_option) @@ -272,7 +342,7 @@ end it "enables the user to select a single value from a list" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search(second_option) field.select_option(second_option) @@ -287,12 +357,14 @@ end it "clears the input if clicked on the clear button" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.clear field.expect_blank end + + include_examples "shows comment input only when comments are allowed by custom field" end describe "with single select list CF" do @@ -305,17 +377,19 @@ let(:second_option) { custom_field.custom_options.second.value } let(:third_option) { custom_field.custom_options.third.value } - it_behaves_like "a autocomplete single select field" + it_behaves_like "an autocomplete single select field" it "shows the default value if no value is given" do custom_field.custom_values.destroy_all custom_field.custom_options.first.update!(default_value: true) - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.expect_selected(custom_field.custom_options.first.value) end + + it_behaves_like "displays readonly modal for user without edit permission" end describe "with single version select list CF" do @@ -328,7 +402,7 @@ let(:second_option) { second_version.name } let(:third_option) { third_version.name } - it_behaves_like "a autocomplete single select field" + it_behaves_like "an autocomplete single select field" describe "with correct version scoping" do context "with a version on a different project" do @@ -337,7 +411,7 @@ end it "shows only versions that are associated with this project" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search("Version 1") field.expect_option(first_version.name, grouping: project.name) @@ -356,7 +430,7 @@ let(:allow_non_open_versions) { false } it "does not shows closed version option" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.open_options field.expect_option(first_version.name) @@ -368,7 +442,7 @@ let(:allow_non_open_versions) { true } it "shows closed version option" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.open_options field.expect_option(first_version.name) @@ -377,6 +451,8 @@ end end end + + it_behaves_like "displays readonly modal for user without edit permission" end describe "with single user select list CF" do @@ -389,7 +465,7 @@ let(:second_option) { another_member_in_project.name } let(:third_option) { one_more_member_in_project.name } - it_behaves_like "a autocomplete single select field" + it_behaves_like "an autocomplete single select field" describe "with correct user scoping" do let!(:member_in_other_project) do @@ -400,7 +476,7 @@ end it "shows only users that are members of the project" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search("Member 1") @@ -426,7 +502,7 @@ end it "shows only groups that are associated with this project" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search("Group 1") @@ -442,20 +518,22 @@ end it "shows the placeholder user" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search("Placeholder User") field.expect_option(placeholder_user.name) end end + + it_behaves_like "displays readonly modal for user without edit permission" end end describe "with multi select fields" do - shared_examples "a autocomplete multi select field" do + shared_examples "an autocomplete multi select field" do it "shows the correct value if given" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.expect_selected(*expected_initial_value) end @@ -463,13 +541,13 @@ it "shows a blank input if no value or default value is given" do custom_field.custom_values.destroy_all - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.expect_blank end it "filters the list based on the input" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search(second_option) @@ -481,7 +559,7 @@ it "allows to select multiple values" do custom_field.custom_values.destroy_all - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.select_option(second_option) field.select_option(third_option) @@ -493,7 +571,7 @@ it "allows to remove selected values" do custom_field.custom_values.destroy_all - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.select_option(second_option) field.select_option(third_option) @@ -507,7 +585,7 @@ it "allows to remove all selected values at once" do custom_field.custom_values.destroy_all - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.select_option(second_option) field.select_option(third_option) @@ -517,6 +595,8 @@ field.expect_not_selected(second_option) field.expect_not_selected(third_option) end + + include_examples "shows comment input only when comments are allowed by custom field" end describe "with multi select list CF" do @@ -529,7 +609,7 @@ let(:second_option) { custom_field.custom_options.second.value } let(:third_option) { custom_field.custom_options.third.value } - it_behaves_like "a autocomplete multi select field" + it_behaves_like "an autocomplete multi select field" it "shows the default value if no value is given" do multi_list_project_custom_field.custom_values.destroy_all @@ -537,11 +617,15 @@ multi_list_project_custom_field.custom_options.first.update!(default_value: true) multi_list_project_custom_field.custom_options.second.update!(default_value: true) - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.expect_selected(multi_list_project_custom_field.custom_options.first.value) field.expect_selected(multi_list_project_custom_field.custom_options.second.value) end + + it_behaves_like "displays readonly modal for user without edit permission" do + let(:value_text) { expected_initial_value.join(", ") } + end end describe "with multi version select list CF" do @@ -554,7 +638,7 @@ let(:second_option) { second_version.name } let(:third_option) { third_version.name } - it_behaves_like "a autocomplete multi select field" + it_behaves_like "an autocomplete multi select field" describe "with correct version scoping" do context "with a version on a different project" do @@ -563,7 +647,7 @@ end it "shows only versions that are associated with this project" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search("Version 1") @@ -583,7 +667,7 @@ let(:allow_non_open_versions) { false } it "does not shows closed version option" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.open_options field.expect_option(first_version.name) @@ -595,7 +679,7 @@ let(:allow_non_open_versions) { true } it "shows closed version option" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.open_options field.expect_option(first_version.name) @@ -604,6 +688,10 @@ end end end + + it_behaves_like "displays readonly modal for user without edit permission" do + let(:value_text) { expected_initial_value.join(", ") } + end end describe "with multi user select list CF" do @@ -616,7 +704,7 @@ let(:second_option) { another_member_in_project.name } let(:third_option) { one_more_member_in_project.name } - it_behaves_like "a autocomplete multi select field" + it_behaves_like "an autocomplete multi select field" describe "with correct user scoping" do let!(:member_in_other_project) do @@ -627,7 +715,7 @@ end it "shows only users that are members of the project" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search("Member 1") @@ -657,7 +745,7 @@ end it "shows only groups that are associated with this project" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search("Group 1") field.expect_option(group.name) @@ -665,7 +753,7 @@ end it "enables to select multiple user groups" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.select_option("Group 1 in project") field.select_option("Group 2 in project") @@ -690,7 +778,7 @@ end it "shows only placeholder users from this project" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.search("Placeholder User") @@ -700,7 +788,7 @@ end it "enables to select multiple placeholder users" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) field.select_option(placeholder_user.name) field.select_option(another_placeholder_user.name) @@ -709,6 +797,16 @@ field.expect_selected(another_placeholder_user.name) end end + + it_behaves_like "displays readonly modal for user without edit permission" do + let(:value_text) do + / + #{Regexp.escape(member_in_project.name)} + .* + #{Regexp.escape(another_member_in_project.name)} + /mx + end + end end end end diff --git a/spec/features/projects/project_custom_fields/overview_page/dialog/permission_spec.rb b/spec/features/projects/project_custom_fields/overview_page/dialog/permission_spec.rb index 7e0cac7063d3..a0f9d73ea3d2 100644 --- a/spec/features/projects/project_custom_fields/overview_page/dialog/permission_spec.rb +++ b/spec/features/projects/project_custom_fields/overview_page/dialog/permission_spec.rb @@ -33,7 +33,13 @@ RSpec.describe "Edit project custom fields on project overview page", :js do include_context "with seeded projects, members and project custom fields" + let(:overview_page) { Pages::Projects::Show.new(project) } + let(:enable_comments) { false } + + before do + ProjectCustomField.update_all(has_comment: true) if enable_comments + end describe "with insufficient View attributes permissions" do before do @@ -44,6 +50,14 @@ it "does not show the attributes sidebar" do overview_page.expect_no_visible_sidebar end + + context "when comments are allowed" do + let(:enable_comments) { true } + + it "does not show the modal buttons" do + overview_page.expect_no_visible_sidebar + end + end end describe "with sufficient View attributes permissions" do @@ -57,6 +71,16 @@ expect(page).to have_text("Input fields") end end + + context "when comments are allowed" do + let(:enable_comments) { true } + + it "does not show the modal buttons" do + overview_page.within_project_attributes_sidebar do + expect(page).to have_no_test_selector("[data-test-selector*='project-custom-field-modal-button-']") + end + end + end end describe "with Edit project permissions" do @@ -65,11 +89,21 @@ overview_page.visit_page end - it "does not show the edit buttons" do + it "does not show the modal buttons" do overview_page.within_project_attributes_sidebar do expect(page).to have_no_test_selector("[data-test-selector*='project-custom-field-modal-button-']") end end + + context "when comments are allowed" do + let(:enable_comments) { true } + + it "does not show the modal buttons" do + overview_page.within_project_attributes_sidebar do + expect(page).to have_no_test_selector("[data-test-selector*='project-custom-field-modal-button-']") + end + end + end end describe "with insufficient Edit attributes permissions" do @@ -81,11 +115,21 @@ overview_page.visit_page end - it "does not show the edit buttons" do + it "does not show the modal buttons" do overview_page.within_project_attributes_sidebar do expect(page).to have_no_css("[data-test-selector*='project-custom-field-modal-button-']") end end + + context "when comments are allowed" do + let(:enable_comments) { true } + + it "shows the modal buttons on all enabled custom fields" do + overview_page.within_project_attributes_sidebar do + expect(page).to have_css("[data-test-selector*='project-custom-field-modal-button-']", count: 15) + end + end + end end describe "with sufficient Edit attributes permissions" do @@ -94,11 +138,21 @@ overview_page.visit_page end - it "shows the edit buttons" do + it "shows the modal buttons" do overview_page.within_project_attributes_sidebar do expect(page).to have_css("[data-test-selector*='project-custom-field-modal-button-']", count: 13) end end + + context "when comments are allowed" do + let(:enable_comments) { true } + + it "shows the modal buttons on all enabled custom fields" do + overview_page.within_project_attributes_sidebar do + expect(page).to have_css("[data-test-selector*='project-custom-field-modal-button-']", count: 15) + end + end + end end describe "with insufficient Edit attribute permission on the update dialog" do @@ -112,7 +166,7 @@ end it "responds with a permission denied message" do - overview_page.open_edit_dialog_for_custom_field(custom_field) + overview_page.open_modal_for_custom_field(custom_field) # Change role to project edit, so the user won't have the project attributes edit role member_with_project_attributes_edit_permissions.memberships.first.update(roles: [edit_project_role]) member_with_project_attributes_edit_permissions.reload diff --git a/spec/features/projects/project_custom_fields/overview_page/dialog/render_spec.rb b/spec/features/projects/project_custom_fields/overview_page/dialog/render_spec.rb index 646a8efa2ea9..965682fdbcc4 100644 --- a/spec/features/projects/project_custom_fields/overview_page/dialog/render_spec.rb +++ b/spec/features/projects/project_custom_fields/overview_page/dialog/render_spec.rb @@ -42,7 +42,7 @@ end it "opens a dialog showing the input for project custom field" do - dialog = overview_page.open_edit_dialog_for_custom_field(boolean_project_custom_field) + dialog = overview_page.open_modal_for_custom_field(boolean_project_custom_field) dialog.expect_open @@ -56,19 +56,19 @@ expect(page).to have_no_css(dialog.async_content_container_css_selector, visible: :all) - overview_page.open_edit_dialog_for_custom_field(boolean_project_custom_field) + overview_page.open_modal_for_custom_field(boolean_project_custom_field) expect(page).to have_css(dialog.async_content_container_css_selector, visible: :visible) end it "can be closed via close icon or cancel button" do - dialog = overview_page.open_edit_dialog_for_custom_field(boolean_project_custom_field) + dialog = overview_page.open_modal_for_custom_field(boolean_project_custom_field) dialog.close_via_icon dialog.expect_closed - dialog = overview_page.open_edit_dialog_for_custom_field(string_project_custom_field) + dialog = overview_page.open_modal_for_custom_field(string_project_custom_field) dialog.close_via_button diff --git a/spec/features/projects/project_custom_fields/overview_page/dialog/update_spec.rb b/spec/features/projects/project_custom_fields/overview_page/dialog/update_spec.rb index 39690b6eda9c..1a482609a174 100644 --- a/spec/features/projects/project_custom_fields/overview_page/dialog/update_spec.rb +++ b/spec/features/projects/project_custom_fields/overview_page/dialog/update_spec.rb @@ -35,13 +35,34 @@ include_context "with seeded projects, members and project custom fields" let(:overview_page) { Pages::Projects::Show.new(project) } - let(:dialog) { Components::Projects::ProjectCustomFields::Dialog.new(project, custom_field) } before do login_as member_with_project_attributes_edit_permissions end describe "with correct updating behaviour" do + def open_dialog + dialog = overview_page.open_modal_for_custom_field(custom_field) + + yield dialog + dialog.submit + dialog.expect_closed + end + + shared_examples "saves custom comment" do + it "saves custom comment" do + custom_field.update!(has_comment: true) + + overview_page.visit_page + + open_dialog do + fill_in "Comment", with: "a comment" + end + + expect(project.reload.send(custom_field.comment_attribute_name)).to eq "a comment" + end + end + describe "with input fields" do shared_examples "a custom field checkbox" do it "sets the value to true if checked" do @@ -53,12 +74,9 @@ expect(page).to have_content I18n.t("placeholders.default") end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.check - - dialog.submit - dialog.expect_closed + open_dialog do + field.check + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_content "Yes" @@ -72,12 +90,9 @@ expect(page).to have_content "Yes" end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.uncheck - - dialog.submit - dialog.expect_closed + open_dialog do + field.uncheck + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_content "No" @@ -91,17 +106,16 @@ expect(page).to have_content "Yes" end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - # don't touch the input - - dialog.submit - dialog.expect_closed + open_dialog do |dialog| + # don't touch the input + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_content "Yes" end end + + include_examples "saves custom comment" end shared_examples "a custom field input" do @@ -114,12 +128,9 @@ expect(page).to have_content I18n.t("placeholders.default") end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.fill_in(with: update_value) - - dialog.submit - dialog.expect_closed + open_dialog do + field.fill_in(with: update_value) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_content expected_updated_value @@ -133,12 +144,9 @@ expect(page).to have_content expected_initial_value end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - # don't touch the input - - dialog.submit - dialog.expect_closed + open_dialog do |dialog| + # don't touch the input + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_content expected_initial_value @@ -152,17 +160,16 @@ expect(page).to have_content expected_initial_value end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.fill_in(with: "") - - dialog.submit - dialog.expect_closed + open_dialog do + field.fill_in(with: "") + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_content I18n.t("placeholders.default") end end + + include_examples "saves custom comment" end shared_examples "affecting calculated value" do @@ -173,12 +180,9 @@ expect(page).to have_content expected_initial_calculated_value end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.fill_in(with: update_value) - - dialog.submit - dialog.expect_closed + open_dialog do + field.fill_in(with: update_value) + end overview_page.within_custom_field_container(calculated_value_custom_field) do expect(page).to have_content expected_updated_calculated_value @@ -192,12 +196,9 @@ expect(page).to have_content expected_initial_calculated_value end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - # don't touch the input - - dialog.submit - dialog.expect_closed + open_dialog do |dialog| + # don't touch the input + end overview_page.within_custom_field_container(calculated_value_custom_field) do expect(page).to have_content expected_initial_calculated_value @@ -211,12 +212,9 @@ expect(page).to have_content expected_initial_calculated_value end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.fill_in(with: "") - - dialog.submit - dialog.expect_closed + open_dialog do + field.fill_in(with: "") + end overview_page.within_custom_field_container(calculated_value_custom_field) do expect(page).to have_content I18n.t("placeholders.default") @@ -234,12 +232,9 @@ expect(page).to have_no_text(expected_updated_value) end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.set_value(update_value) - - dialog.submit - dialog.expect_closed + open_dialog do + field.set_value(update_value) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text(expected_updated_value) @@ -253,12 +248,9 @@ expect(page).to have_content expected_initial_value end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - # don't touch the input - - dialog.submit - dialog.expect_closed + open_dialog do |dialog| + # don't touch the input + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_content expected_initial_value @@ -272,17 +264,16 @@ expect(page).to have_text(expected_initial_value) end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.set_value("") - - dialog.submit - dialog.expect_closed + open_dialog do + field.set_value("") + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_no_text(expected_initial_value) end end + + include_examples "saves custom comment" end describe "with boolean CF" do @@ -365,6 +356,12 @@ it_behaves_like "a rich text custom field input" end + + describe "with calculated CF with comment enabled" do + let(:custom_field) { calculated_from_int_project_custom_field } + + include_examples "saves custom comment" + end end describe "with select fields" do @@ -378,12 +375,9 @@ expect(page).to have_no_text first_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.select_option(first_option) - - dialog.submit - dialog.expect_closed + open_dialog do + field.select_option(first_option) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text first_option @@ -397,13 +391,10 @@ expect(page).to have_text first_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.expect_selected(first_option) # wait for proper initialization - # don't touch the input - - dialog.submit - dialog.expect_closed + open_dialog do + field.expect_selected(first_option) # wait for proper initialization + # don't touch the input + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text first_option @@ -417,12 +408,9 @@ expect(page).to have_text first_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.clear - - dialog.submit - dialog.expect_closed + open_dialog do + field.clear + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_no_text first_option @@ -442,13 +430,10 @@ expect(page).to have_no_text unused_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - # Choose the unused option as the new selection - field.select_option(unused_option) - - dialog.submit - dialog.expect_closed + open_dialog do + # Choose the unused option as the new selection + field.select_option(unused_option) + end # Display the new selection in the sidebar overview_page.within_custom_field_container(custom_field) do @@ -456,6 +441,8 @@ expect(page).to have_no_text first_option end end + + include_examples "saves custom comment" end describe "with list CF" do @@ -501,12 +488,9 @@ overview_page.visit_page - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.select_option(group.name) - - dialog.submit - dialog.expect_closed + open_dialog do + field.select_option(group.name) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text group.name @@ -525,12 +509,9 @@ overview_page.visit_page - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.select_option(placeholder_user.name) - - dialog.submit - dialog.expect_closed + open_dialog do + field.select_option(placeholder_user.name) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text placeholder_user.name @@ -541,7 +522,7 @@ end describe "with multi select fields" do - shared_examples "a autocomplete multi select field" do + shared_examples "an autocomplete multi select field" do it "saves single selected values properly" do custom_field.custom_values.delete_all @@ -551,12 +532,9 @@ expect(page).to have_no_text first_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.select_option(first_option) - - dialog.submit - dialog.expect_closed + open_dialog do + field.select_option(first_option) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text first_option @@ -573,13 +551,10 @@ expect(page).to have_no_text second_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.select_option(first_option) - field.select_option(second_option) - - dialog.submit - dialog.expect_closed + open_dialog do + field.select_option(first_option) + field.select_option(second_option) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text first_option @@ -595,12 +570,9 @@ expect(page).to have_text second_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.deselect_option(first_option) - - dialog.submit - dialog.expect_closed + open_dialog do + field.deselect_option(first_option) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_no_text first_option @@ -616,13 +588,10 @@ expect(page).to have_text second_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.expect_selected(first_option, second_option) # wait for proper initialization - # don't touch the values - - dialog.submit - dialog.expect_closed + open_dialog do + field.expect_selected(first_option, second_option) # wait for proper initialization + # don't touch the values + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text first_option @@ -638,12 +607,9 @@ expect(page).to have_text second_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.clear - - dialog.submit - dialog.expect_closed + open_dialog do + field.clear + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_no_text first_option @@ -661,30 +627,26 @@ expect(page).to have_no_text second_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.select_option(first_option) - - dialog.submit - dialog.expect_closed + open_dialog do + field.select_option(first_option) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text first_option expect(page).to have_no_text second_option end - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.select_option(second_option) - - dialog.submit - dialog.expect_closed + open_dialog do + field.select_option(second_option) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text first_option expect(page).to have_text second_option end end + + include_examples "saves custom comment" end describe "with multi select list CF" do @@ -694,7 +656,7 @@ let(:first_option) { custom_field.custom_options.first.value } let(:second_option) { custom_field.custom_options.second.value } - it_behaves_like "a autocomplete multi select field" + it_behaves_like "an autocomplete multi select field" end describe "with multi version select list CF" do @@ -704,7 +666,7 @@ let(:first_option) { first_version.name } let(:second_option) { second_version.name } - it_behaves_like "a autocomplete multi select field" + it_behaves_like "an autocomplete multi select field" end describe "with multi user select list CF" do @@ -714,7 +676,7 @@ let(:first_option) { member_in_project.name } let(:second_option) { another_member_in_project.name } - it_behaves_like "a autocomplete multi select field" + it_behaves_like "an autocomplete multi select field" describe "with support for user groups" do let!(:group) do @@ -731,13 +693,10 @@ overview_page.visit_page - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.select_option(group.name) - field.select_option(another_group.name) - - dialog.submit - dialog.expect_closed + open_dialog do + field.select_option(group.name) + field.select_option(another_group.name) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text group.name @@ -761,13 +720,10 @@ overview_page.visit_page - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.select_option(placeholder_user.name) - field.select_option(another_placeholder_user.name) - - dialog.submit - dialog.expect_closed + open_dialog do + field.select_option(placeholder_user.name) + field.select_option(another_placeholder_user.name) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_text placeholder_user.name @@ -813,11 +769,9 @@ overview_page.visit_page - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.fill_in(with: "new value") - dialog.submit - dialog.expect_closed + open_dialog do + field.fill_in(with: "new value") + end custom_values = project.custom_values.where.not(custom_field: string_project_custom_field) @@ -847,12 +801,9 @@ overview_page.visit_page - overview_page.open_edit_dialog_for_custom_field(custom_field) - - field.fill_in(with: 567) - - dialog.submit - dialog.expect_closed + open_dialog do + field.fill_in(with: 567) + end overview_page.within_custom_field_container(custom_field) do expect(page).to have_content "567" diff --git a/spec/features/projects/project_custom_fields/overview_page/dialog/validation_spec.rb b/spec/features/projects/project_custom_fields/overview_page/dialog/validation_spec.rb index ed83bba6cfbf..43ead7a04b0b 100644 --- a/spec/features/projects/project_custom_fields/overview_page/dialog/validation_spec.rb +++ b/spec/features/projects/project_custom_fields/overview_page/dialog/validation_spec.rb @@ -48,7 +48,7 @@ custom_field.update!(is_required: true) field = FormFields::Primerized::InputField.new(custom_field) - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + dialog = overview_page.open_modal_for_custom_field(custom_field) dialog.within_async_content do expect(page).to have_text("String field") @@ -67,24 +67,35 @@ end end - describe "does not loose the unpersisted values of the custom fields" do - shared_examples "keeps the cleared value" do + describe "does not loose the unpersisted values" do + shared_examples "keeps the unpersisted values" do it "keeps the value" do invalid_custom_field.update!(is_required: true) - dialog = overview_page.open_edit_dialog_for_custom_field(invalid_custom_field) + dialog = overview_page.open_modal_for_custom_field(invalid_custom_field) invalid_field.clear dialog.submit invalid_field.expect_error(I18n.t("activerecord.errors.messages.blank")) invalid_field.expect_blank end + + it "keeps the custom comment value" do + invalid_custom_field.update!(is_required: true, has_comment: true) + dialog = overview_page.open_modal_for_custom_field(invalid_custom_field) + invalid_field.clear + fill_in "Comment", with: "A helpful comment" + dialog.submit + + invalid_field.expect_error(I18n.t("activerecord.errors.messages.blank")) + expect(page).to have_field("Comment", with: "A helpful comment") + end end context "with input fields" do let(:invalid_custom_field) { string_project_custom_field } let(:invalid_field) { FormFields::Primerized::InputField.new(invalid_custom_field) } - it_behaves_like "keeps the cleared value" + it_behaves_like "keeps the unpersisted values" end context "with select fields" do @@ -92,21 +103,21 @@ let(:invalid_custom_field) { version_project_custom_field } let(:invalid_field) { FormFields::Primerized::AutocompleteField.new(invalid_custom_field) } - it_behaves_like "keeps the cleared value" + it_behaves_like "keeps the unpersisted values" end context "with user selected" do let(:invalid_custom_field) { user_project_custom_field } let(:invalid_field) { FormFields::Primerized::AutocompleteField.new(invalid_custom_field) } - it_behaves_like "keeps the cleared value" + it_behaves_like "keeps the unpersisted values" end context "with list selected" do let(:invalid_custom_field) { list_project_custom_field } let(:invalid_field) { FormFields::Primerized::AutocompleteField.new(invalid_custom_field) } - it_behaves_like "keeps the cleared value" + it_behaves_like "keeps the unpersisted values" end end @@ -115,21 +126,21 @@ let(:invalid_custom_field) { multi_version_project_custom_field } let(:invalid_field) { FormFields::Primerized::AutocompleteField.new(invalid_custom_field) } - it_behaves_like "keeps the cleared value" + it_behaves_like "keeps the unpersisted values" end context "with multi user selected" do let(:invalid_custom_field) { multi_user_project_custom_field } let(:invalid_field) { FormFields::Primerized::AutocompleteField.new(invalid_custom_field) } - it_behaves_like "keeps the cleared value" + it_behaves_like "keeps the unpersisted values" end context "with multi list selected" do let(:invalid_custom_field) { multi_list_project_custom_field } let(:invalid_field) { FormFields::Primerized::AutocompleteField.new(invalid_custom_field) } - it_behaves_like "keeps the cleared value" + it_behaves_like "keeps the unpersisted values" end end end @@ -148,10 +159,10 @@ list_project_custom_field.update!(is_required: true) list_project_custom_field.custom_values.destroy_all - dialog = overview_page.open_edit_dialog_for_custom_field(string_project_custom_field) + dialog = overview_page.open_modal_for_custom_field(string_project_custom_field) dialog.close - dialog = overview_page.open_edit_dialog_for_custom_field(list_project_custom_field) + dialog = overview_page.open_modal_for_custom_field(list_project_custom_field) dialog.submit field.expect_error(I18n.t("activerecord.errors.messages.blank")) @@ -175,14 +186,14 @@ it "validates required fields only within their respective sections" do # Test 1: Multi-select field can be saved even when other required fields are invalid multi_list_field_dialog = - overview_page.open_edit_dialog_for_custom_field(multi_list_project_custom_field) + overview_page.open_modal_for_custom_field(multi_list_project_custom_field) multi_list_field_dialog.submit multi_list_field_dialog.expect_closed # Test 2: Edit the required string field string_field_dialog = - overview_page.open_edit_dialog_for_custom_field(string_project_custom_field) + overview_page.open_modal_for_custom_field(string_project_custom_field) # Submit without filling - should show error string_field_dialog.submit @@ -191,7 +202,7 @@ # Test 3: Edit the required list field list_field_dialog = - overview_page.open_edit_dialog_for_custom_field(list_project_custom_field) + overview_page.open_modal_for_custom_field(list_project_custom_field) # Submit without filling - should show error list_field_dialog.submit @@ -204,7 +215,7 @@ # Test 5: The required string field dialog still fails validation when empty string_field_dialog = - overview_page.open_edit_dialog_for_custom_field(string_project_custom_field) + overview_page.open_modal_for_custom_field(string_project_custom_field) string_field_dialog.submit string_field.expect_error(I18n.t("activerecord.errors.messages.blank")) @@ -222,7 +233,7 @@ custom_field.update!(is_required: true) custom_field.custom_values.destroy_all - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + dialog = overview_page.open_modal_for_custom_field(custom_field) dialog.submit @@ -272,7 +283,7 @@ it "allows saving the dialog even if the calculated custom field is invalid" do custom_field.custom_values.destroy_all - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + dialog = overview_page.open_modal_for_custom_field(custom_field) dialog.submit @@ -320,7 +331,7 @@ custom_field.update!(is_required: true) custom_field.custom_values.destroy_all - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + dialog = overview_page.open_modal_for_custom_field(custom_field) dialog.submit @@ -356,7 +367,7 @@ custom_field.update!(is_required: true) custom_field.custom_values.destroy_all - dialog = overview_page.open_edit_dialog_for_custom_field(custom_field) + dialog = overview_page.open_modal_for_custom_field(custom_field) dialog.submit diff --git a/spec/features/projects/project_custom_fields/overview_page/shared_context.rb b/spec/features/projects/project_custom_fields/overview_page/shared_context.rb index b86de1c6462e..7469229b58b9 100644 --- a/spec/features/projects/project_custom_fields/overview_page/shared_context.rb +++ b/spec/features/projects/project_custom_fields/overview_page/shared_context.rb @@ -108,171 +108,180 @@ let!(:section_for_multi_select_fields) { create(:project_custom_field_section, name: "Multi select fields") } let!(:boolean_project_custom_field) do - field = create(:boolean_project_custom_field, projects: [project], - name: "Boolean field", - project_custom_field_section: section_for_input_fields) - - create(:custom_value, customized: project, custom_field: field, value: true) - - field + create( + :boolean_project_custom_field, + projects: [project], + name: "Boolean field", + project_custom_field_section: section_for_input_fields + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: true) + end end let!(:string_project_custom_field) do - field = create(:string_project_custom_field, projects: [project], - name: "String field", - project_custom_field_section: section_for_input_fields) - - create(:custom_value, customized: project, custom_field: field, value: "Foo") - - field + create( + :string_project_custom_field, + projects: [project], + name: "String field", + project_custom_field_section: section_for_input_fields + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: "Foo") + end end let!(:integer_project_custom_field) do - field = create(:integer_project_custom_field, projects: [project], - name: "Integer field", - project_custom_field_section: section_for_input_fields) - - create(:custom_value, customized: project, custom_field: field, value: 123) - - field + create( + :integer_project_custom_field, + projects: [project], + name: "Integer field", + project_custom_field_section: section_for_input_fields + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: 123) + end end let!(:float_project_custom_field) do - field = create(:float_project_custom_field, projects: [project], - name: "Float field", - project_custom_field_section: section_for_input_fields) - - create(:custom_value, customized: project, custom_field: field, value: 123.456) - - field + create( + :float_project_custom_field, + projects: [project], + name: "Float field", + project_custom_field_section: section_for_input_fields + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: 123.456) + end end let!(:date_project_custom_field) do - field = create(:date_project_custom_field, projects: [project], - name: "Date field", - project_custom_field_section: section_for_input_fields) - - create(:custom_value, customized: project, custom_field: field, value: Date.new(2024, 1, 1)) - - field + create( + :date_project_custom_field, + projects: [project], + name: "Date field", + project_custom_field_section: section_for_input_fields + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: Date.new(2024, 1, 1)) + end end let!(:link_project_custom_field) do - field = create(:link_project_custom_field, projects: [project], - name: "Link field", - project_custom_field_section: section_for_input_fields) - - create(:custom_value, customized: project, custom_field: field, value: "https://www.openproject.org") - - field + create( + :link_project_custom_field, + projects: [project], + name: "Link field", + project_custom_field_section: section_for_input_fields + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: "https://www.openproject.org") + end end let!(:text_project_custom_field) do - field = create(:text_project_custom_field, projects: [project], - name: "Text field", - project_custom_field_section: section_for_input_fields) - - create(:custom_value, customized: project, custom_field: field, value: "Lorem\n\nipsum") - - field + create( + :text_project_custom_field, + projects: [project], + name: "Text field", + project_custom_field_section: section_for_input_fields + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: "Lorem\n\nipsum") + end end let!(:calculated_from_int_project_custom_field) do - field = create( + create( :calculated_value_project_custom_field, :skip_validations, formula: "{{cf_#{integer_project_custom_field.id}}} * 2", projects: [project], name: "Calculated field using int", project_custom_field_section: section_for_input_fields - ) - - create(:custom_value, customized: project, custom_field: field, value: 234) - - field + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: 234) + end end let!(:calculated_from_int_and_float_project_custom_field) do - field = create( + create( :calculated_value_project_custom_field, :skip_validations, formula: "{{cf_#{float_project_custom_field.id}}} * {{cf_#{integer_project_custom_field.id}}}", projects: [project], name: "Calculated field using int and float", project_custom_field_section: section_for_input_fields - ) - - create(:custom_value, customized: project, custom_field: field, value: 123 * 123.456) - - field + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: 123 * 123.456) + end end let!(:list_project_custom_field) do - field = create(:list_project_custom_field, projects: [project], - name: "List field", - project_custom_field_section: section_for_select_fields, - possible_values: ["Option 1", "Option 2", "Option 3"]) - - create(:custom_value, customized: project, custom_field: field, value: field.custom_options.first) - - field + create( + :list_project_custom_field, + projects: [project], + name: "List field", + project_custom_field_section: section_for_select_fields, + possible_values: ["Option 1", "Option 2", "Option 3"] + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: field.custom_options.first) + end end let!(:version_project_custom_field) do - field = create(:version_project_custom_field, projects: [project], - name: "Version field", - project_custom_field_section: section_for_select_fields) - - create(:custom_value, customized: project, custom_field: field, value: first_version.id) - - field + create( + :version_project_custom_field, + projects: [project], + name: "Version field", + project_custom_field_section: section_for_select_fields + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: first_version.id) + end end let!(:user_project_custom_field) do - field = create(:user_project_custom_field, projects: [project], - name: "User field", - project_custom_field_section: section_for_select_fields) - - create(:custom_value, customized: project, custom_field: field, value: member_in_project.id) - - field + create( + :user_project_custom_field, + projects: [project], + name: "User field", + project_custom_field_section: section_for_select_fields + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: member_in_project.id) + end end let!(:multi_list_project_custom_field) do - field = create(:list_project_custom_field, projects: [project], - name: "Multi list field", - project_custom_field_section: section_for_multi_select_fields, - possible_values: ["Option 1", "Option 2", "Option 3"], - multi_value: true) - - create(:custom_value, customized: project, custom_field: field, value: field.custom_options.first.id) - create(:custom_value, customized: project, custom_field: field, value: field.custom_options.second.id) - - field + create( + :list_project_custom_field, + projects: [project], + name: "Multi list field", + project_custom_field_section: section_for_multi_select_fields, + possible_values: ["Option 1", "Option 2", "Option 3"], + multi_value: true + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: field.custom_options.first.id) + create(:custom_value, customized: project, custom_field: field, value: field.custom_options.second.id) + end end let!(:multi_version_project_custom_field) do - field = create(:version_project_custom_field, projects: [project], - name: "Multi version field", - project_custom_field_section: section_for_multi_select_fields, - multi_value: true) - - create(:custom_value, customized: project, custom_field: field, value: first_version.id) - create(:custom_value, customized: project, custom_field: field, value: second_version.id) - - field + create( + :version_project_custom_field, + projects: [project], + name: "Multi version field", + project_custom_field_section: section_for_multi_select_fields, + multi_value: true + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: first_version.id) + create(:custom_value, customized: project, custom_field: field, value: second_version.id) + end end let!(:multi_user_project_custom_field) do - field = create(:user_project_custom_field, projects: [project], - name: "Multi user field", - project_custom_field_section: section_for_multi_select_fields, - multi_value: true) - - create(:custom_value, customized: project, custom_field: field, value: member_in_project.id) - create(:custom_value, customized: project, custom_field: field, value: another_member_in_project.id) - - field + create( + :user_project_custom_field, + projects: [project], + name: "Multi user field", + project_custom_field_section: section_for_multi_select_fields, + multi_value: true + ) do |field| + create(:custom_value, customized: project, custom_field: field, value: member_in_project.id) + create(:custom_value, customized: project, custom_field: field, value: another_member_in_project.id) + end end let!(:sections) do @@ -321,8 +330,11 @@ let(:all_fields) { input_fields + select_fields + multi_select_fields + calculated_value_fields } let!(:boolean_project_custom_field_activated_in_other_project) do - create(:boolean_project_custom_field, projects: [other_project], - name: "Other Boolean field", - project_custom_field_section: section_for_input_fields) + create( + :boolean_project_custom_field, + projects: [other_project], + name: "Other Boolean field", + project_custom_field_section: section_for_input_fields + ) end end diff --git a/spec/features/projects/project_custom_fields/overview_page/sidebar_spec.rb b/spec/features/projects/project_custom_fields/overview_page/sidebar_spec.rb index 7f5b00599ee1..c4a0217d242f 100644 --- a/spec/features/projects/project_custom_fields/overview_page/sidebar_spec.rb +++ b/spec/features/projects/project_custom_fields/overview_page/sidebar_spec.rb @@ -662,7 +662,7 @@ overview_page.visit_page # Remove value that is used in a formula: - overview_page.open_edit_dialog_for_custom_field(float_project_custom_field) + overview_page.open_modal_for_custom_field(float_project_custom_field) page.fill_in(float_project_custom_field.name, with: "") page.click_on "Save" @@ -680,7 +680,7 @@ end # Change the value so that the calculation succeeds. - overview_page.open_edit_dialog_for_custom_field(float_project_custom_field) + overview_page.open_modal_for_custom_field(float_project_custom_field) page.fill_in(float_project_custom_field.name, with: "0.2") page.click_on "Save" diff --git a/spec/features/projects/project_custom_fields/overview_page/widget_spec.rb b/spec/features/projects/project_custom_fields/overview_page/widget_spec.rb index b5b8dba499e8..d8176fb05ed4 100644 --- a/spec/features/projects/project_custom_fields/overview_page/widget_spec.rb +++ b/spec/features/projects/project_custom_fields/overview_page/widget_spec.rb @@ -156,7 +156,7 @@ end it "can edit a project custom field from within the widget" do - overview_page.open_edit_dialog_for_custom_field(string_project_custom_field) + overview_page.open_modal_for_custom_field(string_project_custom_field) page.fill_in(string_project_custom_field.name, with: "My super awesome new value") page.click_on "Save" diff --git a/spec/support/components/projects/project_custom_fields/dialog.rb b/spec/support/components/projects/project_custom_fields/dialog.rb index 57d5fc471689..ff3c39c0ebe3 100644 --- a/spec/support/components/projects/project_custom_fields/dialog.rb +++ b/spec/support/components/projects/project_custom_fields/dialog.rb @@ -55,13 +55,16 @@ def async_content_container_css_selector "#{dialog_css_selector} [data-test-selector='async-dialog-content']" end - def within_dialog(&) - within(dialog_css_selector, &) + def within_dialog(close_after_yield: false, &) + within(dialog_css_selector, &).tap do + close if close_after_yield + end end def within_async_content(close_after_yield: false, &) - within(async_content_container_css_selector, &) - close if close_after_yield + within(async_content_container_css_selector, &).tap do + close if close_after_yield + end end def close diff --git a/spec/support/pages/projects/show.rb b/spec/support/pages/projects/show.rb index d414a1f71323..be6ef19938f6 100644 --- a/spec/support/pages/projects/show.rb +++ b/spec/support/pages/projects/show.rb @@ -85,7 +85,13 @@ def expect_no_custom_field(custom_field) expect(page).to have_no_css("[data-test-selector='project-custom-field-#{custom_field.id}']") end - def open_edit_dialog_for_custom_field(custom_field) + def expect_custom_field_without_modal_button(custom_field) + within_custom_field_container(custom_field) do + expect(page).to have_no_test_selector("[data-test-selector*='project-custom-field-modal-button-']") + end + end + + def open_modal_for_custom_field(custom_field) scroll_to_element(page.find("[data-test-selector='project-custom-field-#{custom_field.id}']")) within_custom_field_container(custom_field) do # Link and user type custom fields might contain a clickable link inside the edit container. @@ -97,9 +103,11 @@ def open_edit_dialog_for_custom_field(custom_field) ) end - wait_for_size_animation_completion("[data-test-selector='async-dialog-content']") + dialog = Components::Projects::ProjectCustomFields::Dialog.new(project, custom_field) + + wait_for_size_animation_completion(dialog.dialog_css_selector) - Components::Projects::ProjectCustomFields::Dialog.new(project, custom_field) + dialog end def open_edit_dialog_for_life_cycle(life_cycle, wait_angular: false)