diff --git a/404.html b/404.html index 06bfce52bf..5aa8e33ce3 100644 --- a/404.html +++ b/404.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - + + \ No newline at end of file diff --git a/admin/index.html b/admin/index.html index d7be672953..31825eb7ff 100644 --- a/admin/index.html +++ b/admin/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Set Up and Maintain Your Steedos Organization

As a Steedos administrator—that is, a user assigned to the Administrator profile—you’re responsible for setting up your steedos organization, which means adding users and configuring the system for your needs.

- - + + \ No newline at end of file diff --git a/admin/organization/audit-logs/index.html b/admin/organization/audit-logs/index.html index 4e0bae3351..68e82b17b1 100644 --- a/admin/organization/audit-logs/index.html +++ b/admin/organization/audit-logs/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content
- - +
Skip to main content

Audit logs

The audit log is the report of all the activities done in your Steedos account. It will capture and display events automatically by recording who performed an activity, what when, and where the activity was performed, along with other information such as IP address.

tip

Available on: Professional Edition

+ + \ No newline at end of file diff --git a/admin/organization/company-info/index.html b/admin/organization/company-info/index.html index 67b4009eaa..799e90e8cb 100644 --- a/admin/organization/company-info/index.html +++ b/admin/organization/company-info/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content
- - +
Skip to main content

Company Info

Use the Company Information page in Setup to track what’s important about your company’s organization in Steedos. This page contains the information that was provided when your company signed up with Steedos.

+ + \ No newline at end of file diff --git a/admin/organization/import/index.html b/admin/organization/import/index.html index 209a2d78bc..86d08fa274 100644 --- a/admin/organization/import/index.html +++ b/admin/organization/import/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content
- - +
Skip to main content
+ + \ No newline at end of file diff --git a/admin/organization/index.html b/admin/organization/index.html index 4e07d63b2b..4dec130cf1 100644 --- a/admin/organization/index.html +++ b/admin/organization/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content

Setup Your Organization

- - +
Skip to main content

Setup Your Organization

+ + \ No newline at end of file diff --git a/admin/organization/installed-packages/index.html b/admin/organization/installed-packages/index.html index 9473064e71..f7600b7735 100644 --- a/admin/organization/installed-packages/index.html +++ b/admin/organization/installed-packages/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content
- - +
Skip to main content

Installed Packages

You can install packages into your Steedos organization, and then configure and manage them. To view the packages you’ve installed, from Setup, select Installed Packages.

+ + \ No newline at end of file diff --git a/admin/organization/organizations/index.html b/admin/organization/organizations/index.html index f9ef32580d..0511e81136 100644 --- a/admin/organization/organizations/index.html +++ b/admin/organization/organizations/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content
- - +
Skip to main content

Manage Departments

The Department Management feature allows you to easily manage and organize departments within your organization. With this feature, you can create, edit, and delete departments as well as assign employees to specific departments.

+ + \ No newline at end of file diff --git a/admin/organization/users/index.html b/admin/organization/users/index.html index bed08d68e9..f52e215b4b 100644 --- a/admin/organization/users/index.html +++ b/admin/organization/users/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content
- - +
Skip to main content

Manage Users

In Steedos, each user is uniquely identified with a username, password, and profile. Together with other settings, the profile determines which tasks a user can perform, what data the user can see, and what the user can do with the data.

View and Manage Users

In the user list, you can view and manage all users in your org.

From the user list, you can:

  • Create one user or multiple users.
  • Reset passwords for selected users.
  • Edit a user.
  • View a user’s detail page.
+ + \ No newline at end of file diff --git a/admin/organization/white-label/index.html b/admin/organization/white-label/index.html index b49421ab18..2f770bca68 100644 --- a/admin/organization/white-label/index.html +++ b/admin/organization/white-label/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content
- - +
Skip to main content

White Label

White Label feature will allow you to remove the Steedos branding from the Steedos platform and add your own custom logo and text.

tip

Available on: Professional Edition

This feature allows you to rebrand the following:

Logo on login screen and main app.

Customize Logo

+ + \ No newline at end of file diff --git a/admin/permissions/app-permissions/index.html b/admin/permissions/app-permissions/index.html index c6f1cbadae..0f3c9d8ff2 100644 --- a/admin/permissions/app-permissions/index.html +++ b/admin/permissions/app-permissions/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content

Application Permissions

Steedos supports application authorization based on permission sets, which can be used to restrict users under a certain permission set/profile to only see certain applications.

To restrict the view of applications, go to the "Company Settings > Permission Set/Profile" section of the "Settings" application. Select the permission set or profile that you want to restrict from viewing applications, then choose the allowed applications in the "Authorized Application" field. Any applications that are not selected here will be restricted from view. If the authorized application field is left empty, all applications will be authorized for this permission set or profile.

- - +
Skip to main content

Application Permissions

Steedos supports application authorization based on permission sets, which can be used to restrict users under a certain permission set/profile to only see certain applications.

To restrict the view of applications, go to the "Company Settings > Permission Set/Profile" section of the "Settings" application. Select the permission set or profile that you want to restrict from viewing applications, then choose the allowed applications in the "Authorized Application" field. Any applications that are not selected here will be restricted from view. If the authorized application field is left empty, all applications will be authorized for this permission set or profile.

+ + \ No newline at end of file diff --git a/admin/permissions/before-find/index.html b/admin/permissions/before-find/index.html index b108b659e4..f468097761 100644 --- a/admin/permissions/before-find/index.html +++ b/admin/permissions/before-find/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content
- - +
Skip to main content

Trigger managed permissions

While Steedos provides various built-in solutions to easily achieve precise field and record level permission control as described above, some permission requirements in unique project scenarios may not be met by these methods alone. Therefore, the Steedos permission engine also incorporates beforeFind triggers, which allow personalized and more advanced permission issues to be addressed through code.

+ + \ No newline at end of file diff --git a/admin/permissions/division/index.html b/admin/permissions/division/index.html index 1fdfbd741e..3c24db2bf3 100644 --- a/admin/permissions/division/index.html +++ b/admin/permissions/division/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content

Organize Data with Divisions

Divisions let you segment your organization's data into logical sections, making searches, reports, and list views more meaningful to users. Divisions are useful for organizations with extremely large amounts of data.

tip

Available on: Enterprise Edition

How Divisions Work

Divisions can be assigned to users and other kinds of records. For example, you can create a report to show the opportunities for just the North American division to get accurate sales numbers for the North American sales team.

  • Record-level division—Division is a field on individual records that marks the record as belonging to a particular division.
  • Default division — Users are assigned a default division that applies to their newly created accounts, leads, and custom objects that are enabled for divisions.
- - +
Skip to main content

Organize Data with Divisions

Divisions let you segment your organization's data into logical sections, making searches, reports, and list views more meaningful to users. Divisions are useful for organizations with extremely large amounts of data.

tip

Available on: Enterprise Edition

How Divisions Work

Divisions can be assigned to users and other kinds of records. For example, you can create a report to show the opportunities for just the North American division to get accurate sales numbers for the North American sales team.

  • Record-level division—Division is a field on individual records that marks the record as belonging to a particular division.
  • Default division — Users are assigned a default division that applies to their newly created accounts, leads, and custom objects that are enabled for divisions.
+ + \ No newline at end of file diff --git a/admin/permissions/field-permissions/index.html b/admin/permissions/field-permissions/index.html index 6a419e7f21..a2ec1cd2ad 100644 --- a/admin/permissions/field-permissions/index.html +++ b/admin/permissions/field-permissions/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content

Field Permissions

Field permissions specify the access level for each field in an object.

What Determines Field Access?

Several factors control whether users can view and edit specific fields in Steedos. You can control users’ access to fields at the record type, user, or field level.

  • Page layouts—Set whether fields are visible, required, editable, or read only for a particular record type.
  • Field-level security—Further restrict users’ access to fields by setting whether those fields are visible, editable, or read only. These settings override field properties set in the page layout if the field-level security setting is more restrictive.
  • Permissions—Some user permissions override both page layouts and field-level security settings. For example, users with the “Edit Read Only Fields” permission can always edit read-only fields regardless of any other settings.
  • Object required fields—Override field-level security or any less-restrictive settings on page layouts by making a custom field universally required.
  • Lookup and system fields—If you enable the Require permission to view record names in lookup fields setting, you restrict who can view record names in lookup and system fields. Users must have Read access to these records or the View All Lookup Record Names permission to view this data.

Field-Level Security

Field-level security settings let you restrict users’ access to view and edit specific fields.

Page layouts and field-level security settings determine which fields a user sees. The most restrictive field access settings of the two always applies. For example, you can have a field that’s required in a page layout but is read-only in the field-level security settings. The field-level security overrides the page layout, so the field remains read-only.

- - +
Skip to main content

Field Permissions

Field permissions specify the access level for each field in an object.

What Determines Field Access?

Several factors control whether users can view and edit specific fields in Steedos. You can control users’ access to fields at the record type, user, or field level.

  • Page layouts—Set whether fields are visible, required, editable, or read only for a particular record type.
  • Field-level security—Further restrict users’ access to fields by setting whether those fields are visible, editable, or read only. These settings override field properties set in the page layout if the field-level security setting is more restrictive.
  • Permissions—Some user permissions override both page layouts and field-level security settings. For example, users with the “Edit Read Only Fields” permission can always edit read-only fields regardless of any other settings.
  • Object required fields—Override field-level security or any less-restrictive settings on page layouts by making a custom field universally required.
  • Lookup and system fields—If you enable the Require permission to view record names in lookup fields setting, you restrict who can view record names in lookup and system fields. Users must have Read access to these records or the View All Lookup Record Names permission to view this data.

Field-Level Security

Field-level security settings let you restrict users’ access to view and edit specific fields.

Page layouts and field-level security settings determine which fields a user sees. The most restrictive field access settings of the two always applies. For example, you can have a field that’s required in a page layout but is read-only in the field-level security settings. The field-level security overrides the page layout, so the field remains read-only.

+ + \ No newline at end of file diff --git a/admin/permissions/index.html b/admin/permissions/index.html index db361b867c..9f76eed82b 100644 --- a/admin/permissions/index.html +++ b/admin/permissions/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content

Manage Data Access

Steedos provides a flexible, layered data sharing design that lets admins control user access to data. Managing data access enhances security by exposing only data that’s relevant to users. Use permission sets, permission set groups, and profiles to control the objects and fields users can access. Use sharing rules to specify the individual records that users can view and edit.

- - +
Skip to main content

Manage Data Access

Steedos provides a flexible, layered data sharing design that lets admins control user access to data. Managing data access enhances security by exposing only data that’s relevant to users. Use permission sets, permission set groups, and profiles to control the objects and fields users can access. Use sharing rules to specify the individual records that users can view and edit.

+ + \ No newline at end of file diff --git a/admin/permissions/object-permissions/index.html b/admin/permissions/object-permissions/index.html index e99407b11e..03e77dfc2d 100644 --- a/admin/permissions/object-permissions/index.html +++ b/admin/permissions/object-permissions/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content

Object Permissions

Object permissions specify the base-level access users have to create, read, edit, and delete records for each object. You can manage object permissions in permission sets and profiles.

The following permissions specify the access that users have to objects.

PERMISSIONDESCRIPTION
ReadUsers can only view records of this type.
CreateUsers can read and create records.
EditUsers can read and update records.
DeleteUsers can read, edit, and delete records.
View AllUsers can view all records associated with this object, regardless of sharing settings.
Modify AllUsers can read, edit, delete, transfer, and approve all records associated with this object, regardless of sharing settings.
- - +
Skip to main content

Object Permissions

Object permissions specify the base-level access users have to create, read, edit, and delete records for each object. You can manage object permissions in permission sets and profiles.

The following permissions specify the access that users have to objects.

PERMISSIONDESCRIPTION
ReadUsers can only view records of this type.
CreateUsers can read and create records.
EditUsers can read and update records.
DeleteUsers can read, edit, and delete records.
View AllUsers can view all records associated with this object, regardless of sharing settings.
Modify AllUsers can read, edit, delete, transfer, and approve all records associated with this object, regardless of sharing settings.
+ + \ No newline at end of file diff --git a/admin/permissions/overview/index.html b/admin/permissions/overview/index.html index c148852b57..7216f40e4a 100644 --- a/admin/permissions/overview/index.html +++ b/admin/permissions/overview/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content

Control Who Sees What

Steedos data sharing lets you expose specific data sets to individuals and groups of users. Permission sets, permission set groups, and profiles provide object-level and field-level security by controlling access. Record-level sharing settings, user roles, and sharing rules control the individual records that users can view and edit.

权限引擎 示意图

Object-Level Security (Permission Sets and Profiles)

Object-level security—or object permissions—provide the bluntest way to control data access. You can prevent a user from seeing, creating, editing, or deleting any instance of a particular object type, such as a lead or opportunity, by using object permissions. You can hide tabs and objects from selected users, so that they don’t even know that type of data exists.

You can specify object permissions in permission sets and profiles. Permission sets and profiles are collections of settings and permissions that determine what a user can do in the application. The settings are similar to a group in a Windows network, where the members of the group have the same folder permissions and access to the same software.

Typically, profiles are defined by a user’s job function, such as Steedos admin or sales representative. You can assign one profile to many users, but you can assign only one profile per user. You can use permission sets to grant more permissions and access settings to users. Now it’s easier to manage users’ permissions and access because you can assign multiple permission sets to a single user.

Field-Level Security (Permission Sets and Profiles)

Sometimes you want users to have access to an object while limiting their access to individual fields in that object. Field-level security—or field permissions—control whether a user can see, edit, and delete the value for a particular field on an object. You can protect sensitive fields without hiding the entire object. You also can control field permissions in permission sets and profiles.

Field permissions control the visibility of fields in any part of the app, including related lists, list views, reports, and search results. To ensure that a user can’t access a particular field, use field permissions. No other settings provide as much protection for a field. Page layouts only control the visibility of fields on detail and edit pages.

Record-Level Security (Sharing)

After setting object- and field-level access permissions, you can configure access settings for records. Record-level security lets you give users access to some object records, but not others. Every record is owned by a user or a queue. The owner has full access to the record. In a hierarchy, users higher in the hierarchy always have the same access to users below them in the hierarchy. This access applies to records owned by users and records shared with them.

Sharing rules

With sharing rules you can make automatic exceptions to organization-wide sharing settings for sets of users. Use sharing rules to give these users access to records they don’t own or can’t normally see. Sharing rules, like role hierarchies, are only used to give more users access to records—they can’t be stricter than your organization-wide default settings.

Restriction rules

When a restriction rule is applied to a user, the data that they had read access to via your sharing settings is further scoped to only records matching the record criteria that you set. This behavior is similar to how you can filter results in a list view or report, except that it’s permanent.

Trigger managed permissions

If sharing rules and manual sharing don’t provide the required control, you can use trigger managed sharing. trigger managed sharing allows developers to programmatically share custom objects.

- - +
Skip to main content

Control Who Sees What

Steedos data sharing lets you expose specific data sets to individuals and groups of users. Permission sets, permission set groups, and profiles provide object-level and field-level security by controlling access. Record-level sharing settings, user roles, and sharing rules control the individual records that users can view and edit.

权限引擎 示意图

Object-Level Security (Permission Sets and Profiles)

Object-level security—or object permissions—provide the bluntest way to control data access. You can prevent a user from seeing, creating, editing, or deleting any instance of a particular object type, such as a lead or opportunity, by using object permissions. You can hide tabs and objects from selected users, so that they don’t even know that type of data exists.

You can specify object permissions in permission sets and profiles. Permission sets and profiles are collections of settings and permissions that determine what a user can do in the application. The settings are similar to a group in a Windows network, where the members of the group have the same folder permissions and access to the same software.

Typically, profiles are defined by a user’s job function, such as Steedos admin or sales representative. You can assign one profile to many users, but you can assign only one profile per user. You can use permission sets to grant more permissions and access settings to users. Now it’s easier to manage users’ permissions and access because you can assign multiple permission sets to a single user.

Field-Level Security (Permission Sets and Profiles)

Sometimes you want users to have access to an object while limiting their access to individual fields in that object. Field-level security—or field permissions—control whether a user can see, edit, and delete the value for a particular field on an object. You can protect sensitive fields without hiding the entire object. You also can control field permissions in permission sets and profiles.

Field permissions control the visibility of fields in any part of the app, including related lists, list views, reports, and search results. To ensure that a user can’t access a particular field, use field permissions. No other settings provide as much protection for a field. Page layouts only control the visibility of fields on detail and edit pages.

Record-Level Security (Sharing)

After setting object- and field-level access permissions, you can configure access settings for records. Record-level security lets you give users access to some object records, but not others. Every record is owned by a user or a queue. The owner has full access to the record. In a hierarchy, users higher in the hierarchy always have the same access to users below them in the hierarchy. This access applies to records owned by users and records shared with them.

Sharing rules

With sharing rules you can make automatic exceptions to organization-wide sharing settings for sets of users. Use sharing rules to give these users access to records they don’t own or can’t normally see. Sharing rules, like role hierarchies, are only used to give more users access to records—they can’t be stricter than your organization-wide default settings.

Restriction rules

When a restriction rule is applied to a user, the data that they had read access to via your sharing settings is further scoped to only records matching the record criteria that you set. This behavior is similar to how you can filter results in a list view or report, except that it’s permanent.

Trigger managed permissions

If sharing rules and manual sharing don’t provide the required control, you can use trigger managed sharing. trigger managed sharing allows developers to programmatically share custom objects.

+ + \ No newline at end of file diff --git a/admin/permissions/permission-set/index.html b/admin/permissions/permission-set/index.html index c0de06dc2b..90f270eb95 100644 --- a/admin/permissions/permission-set/index.html +++ b/admin/permissions/permission-set/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content
- - +
Skip to main content

Permission Sets

A permission set is a collection of settings and permissions that give users access to various tools and functions. Permission sets extend users’ functional access without changing their profiles and are the recommended way to manage your users’ permissions.

Users can have only one profile but, they can have multiple permission sets. You can assign permission sets to various types of users, regardless of their profiles.

+ + \ No newline at end of file diff --git a/admin/permissions/profile/index.html b/admin/permissions/profile/index.html index fa563eb439..492c284b16 100644 --- a/admin/permissions/profile/index.html +++ b/admin/permissions/profile/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content

Profiles

Profiles define how users access objects and data, and what they can do within the application. When you create users, you assign a profile to each one.

Every user is assigned only one profile, but can also have multiple permission sets. When determining access for your users, use profiles to assign the minimum permissions and access settings for specific groups of users. Then use permission sets to grant more permissions as needed.

standard profiles

Steedos comes with several standard profiles(admin、user、supplier、customer), and if more, additional custom profiles can be added to expand upon them.

- - +
Skip to main content

Profiles

Profiles define how users access objects and data, and what they can do within the application. When you create users, you assign a profile to each one.

Every user is assigned only one profile, but can also have multiple permission sets. When determining access for your users, use profiles to assign the minimum permissions and access settings for specific groups of users. Then use permission sets to grant more permissions as needed.

standard profiles

Steedos comes with several standard profiles(admin、user、supplier、customer), and if more, additional custom profiles can be added to expand upon them.

+ + \ No newline at end of file diff --git a/admin/permissions/restriction-rules/index.html b/admin/permissions/restriction-rules/index.html index 001f1b4b44..1fb1bd7352 100644 --- a/admin/permissions/restriction-rules/index.html +++ b/admin/permissions/restriction-rules/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content

Restriction Rules

Restriction rules let you enhance your security by allowing certain users to access only specified records. They prevent users from accessing records that can contain sensitive data or information that isn’t essential to their work. Restriction rules filter the records that a user has access to so that they can access only the records that match the criteria you specify.

When Do I Use Restriction Rules?

Use restriction rules when you want certain users to see only a specific set of records. Restriction rules can simplify controlling access to records with sensitive or confidential information. Access to contracts, tasks, and events can be difficult to make truly private using organization-wide defaults, making restriction rules the best way to configure this visibility.

For example, you have competing sales teams that can’t see each other’s activities, even though these activities are on the same account. With restriction rules, you can make sure that sales teams see only activities that belong to them and are relevant to their work. Or, if you provide confidential services to various individuals, use restriction rules so that only team members responsible for supporting these individuals can see related tasks.

- - +
Skip to main content

Restriction Rules

Restriction rules let you enhance your security by allowing certain users to access only specified records. They prevent users from accessing records that can contain sensitive data or information that isn’t essential to their work. Restriction rules filter the records that a user has access to so that they can access only the records that match the criteria you specify.

When Do I Use Restriction Rules?

Use restriction rules when you want certain users to see only a specific set of records. Restriction rules can simplify controlling access to records with sensitive or confidential information. Access to contracts, tasks, and events can be difficult to make truly private using organization-wide defaults, making restriction rules the best way to configure this visibility.

For example, you have competing sales teams that can’t see each other’s activities, even though these activities are on the same account. With restriction rules, you can make sure that sales teams see only activities that belong to them and are relevant to their work. Or, if you provide confidential services to various individuals, use restriction rules so that only team members responsible for supporting these individuals can see related tasks.

+ + \ No newline at end of file diff --git a/admin/permissions/sharing-rules/index.html b/admin/permissions/sharing-rules/index.html index 84527b87a0..a72ff273aa 100644 --- a/admin/permissions/sharing-rules/index.html +++ b/admin/permissions/sharing-rules/index.html @@ -15,13 +15,13 @@ - - + +
-
Skip to main content
- - +
Skip to main content

Sharing Rules

Use sharing rules to extend sharing access to users in public groups, roles, or territories. Sharing rules give particular users greater access by making automatic exceptions to your org-wide sharing settings.

+ + \ No newline at end of file diff --git a/apps/collaboration/approval-king/index.html b/apps/collaboration/approval-king/index.html index b0fecb9072..af4d04255c 100644 --- a/apps/collaboration/approval-king/index.html +++ b/apps/collaboration/approval-king/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Approval King: Streamlining Your Approval Processes

Approval King is an innovative process automation solution designed to streamline and simplify the approval workflows within an organization. By leveraging cutting-edge technology, Approval King transforms traditional, cumbersome approval processes into a seamless, efficient, and transparent system. It empowers organizations to manage approvals with ease, ensuring compliance, enhancing productivity, and accelerating decision-making.

Key Features

Intuitive Workflow Designer

  • Drag-and-Drop Interface: Easily create and customize approval workflows with a user-friendly drag-and-drop interface.
  • Templates and Customization: Choose from a variety of pre-built templates or create custom workflows tailored to your organization's specific needs.

Multi-Level Approval Chains

  • Flexible Approval Hierarchies: Set up multi-level approval chains to reflect your organizational structure and approval policies.
  • Conditional Routing: Implement conditional logic to route requests based on specific criteria, ensuring the right people review and approve each request.

Real-Time Tracking and Notifications

  • Status Tracking: Monitor the progress of approval requests in real-time, with clear visibility into each step of the process.
  • Automated Notifications: Receive instant notifications at each stage of the approval process, ensuring timely responses and action.

Mobile Accessibility

  • Mobile App: Access Approval King on-the-go with a dedicated mobile app, allowing approvers to review and respond to requests from anywhere, at any time.

Integration and Compatibility

  • Seamless Integration: Integrate Approval King with your existing systems, such as ERP, CRM, HRM, and more, for a unified workflow experience.
  • Cross-Platform Compatibility: Use Approval King across various platforms and devices, ensuring a consistent experience for all users.

Security and Compliance

  • Role-Based Access Control: Implement role-based access to ensure sensitive information is only accessible to authorized personnel.
  • Audit Trails: Maintain comprehensive audit trails for every approval request, supporting compliance and accountability.

Reporting and Analytics

  • Custom Reports: Generate custom reports to gain insights into approval patterns, bottlenecks, and performance metrics.
  • Data-Driven Decisions: Leverage analytics to make informed decisions, optimize workflows, and improve overall efficiency.

Approval King is the ultimate solution for organizations seeking to modernize their approval processes. With its robust features, intuitive design, and seamless integration capabilities, Approval King is poised to revolutionize the way approvals are managed, making it an indispensable tool for businesses of all sizes.

- - + + \ No newline at end of file diff --git a/apps/collaboration/index.html b/apps/collaboration/index.html index 33fd87888a..cd7601ad9f 100644 --- a/apps/collaboration/index.html +++ b/apps/collaboration/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Collaboration Tools

Enterprise Collaboration System (ECS) are comprehensive information systems designed to support communication, collaboration, and information sharing among employees within an organization. These systems typically offer a range of tools and features to support team collaboration, project management, document sharing, instant messaging, and other work-related activities.

The core objectives of enterprise collaboration systems are to improve work efficiency, strengthen team collaboration, promote knowledge sharing, and help organizations better manage their internal processes and projects. By using these systems, organizations can overcome geographical and temporal barriers to achieve effective remote collaboration and communication.

The main features of enterprise collaboration systems typically include:

  1. Instant Messaging: Support for real-time text, voice, and video communication among employees.
  2. File Sharing and Management: Allows team members to store, share, and collaboratively edit documents and other files.
  3. Task and Project Management: Provides tools to plan, assign, and track the progress of tasks and projects.
  4. Calendar and Meeting Scheduling: Helps team members schedule meetings, set reminders, and manage calendars.
  5. Knowledge Management: Supports the creation, storage, and sharing of knowledge bases and best practices.
  6. Social Networking Features: Offers social media-like features such as news feeds, team pages, and discussion forums to foster communication and team spirit.
  7. Video Conferencing: Supports face-to-face communication among remote team members through video conferencing.
  8. Workflow Automation: Automates common business processes such as approval workflows, expense reporting, etc.
  9. Integration and Extensibility: Integrates with other enterprise applications (such as CRM, ERP, etc.) and allows for extension through plugins or APIs.
- - + + \ No newline at end of file diff --git a/apps/collaboration/milestone/index.html b/apps/collaboration/milestone/index.html index 530db0412f..2dd93e5078 100644 --- a/apps/collaboration/milestone/index.html +++ b/apps/collaboration/milestone/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Steedos Milestone: Project Task Management System

The Steedos Project Task Management System is an application developed on the Steedos low-code platform, designed to help businesses efficiently plan, track, and manage project tasks. With its flexible customization features, it meets the project management needs of different enterprises, enhancing team collaboration efficiency and ensuring projects are completed on time and to quality standards.

Core Features

Project Organization

  • Program Management: Organize related projects into programs for unified management.
  • Task Breakdown: Decompose projects into manageable tasks and subtasks.
  • Milestone Planning: Set key project milestones to monitor critical junctures.

Task Management

  • Task Assignment: Assign tasks to team members, clarifying responsibilities.
  • Progress Tracking: Update task status in real-time and track progress.
  • Priority Setting: Set priorities for tasks based on their importance.

Issue Tracking

  • Issue Logging: Record issues and obstacles encountered in the project.
  • Issue Resolution: Assign responsible parties and track the issue resolution process.

Time Management

  • Time Logging: Record the actual time spent on each task.
  • Work Log: Keep a record of team members' daily work and achievements.

Team Collaboration

  • Team Communication: Built-in instant messaging tools facilitate team member communication.
  • File Sharing: Centrally manage project documents, supporting collaborative editing.
  • Permission Control: Assign different access and editing permissions based on roles.

Reporting and Analysis

  • Project Dashboard: Provide an overview of the project, including progress, budget, and resource utilization.
  • Task Reports: Generate reports on task completion and time tracking.
  • Data Analysis: Analyze project data to optimize resource allocation and processes.

Customization and Integration

  • Interface Customization: Customize the interface according to corporate branding and user habits.
  • Workflow Automation: Automate common workflows, such as approval processes.
  • System Integration: Integrate with other enterprise systems (such as CRM, ERP, etc.).

Product Advantages

  • Low-Code Platform: Rapid development and deployment, reducing development costs.
  • Flexible Customization: Customize functions and interfaces according to specific enterprise needs.
  • Ease of Use: Intuitive user interface simplifies project management processes.
  • Efficient Collaboration: Enhance team collaboration and improve project execution efficiency.

The Steedos Project Task Management System is an ideal choice for enterprises looking to enhance their project management capabilities. With its powerful features and flexible customization, it helps businesses achieve digital transformation in project management.

- - + + \ No newline at end of file diff --git a/apps/customer-relationship-management/index.html b/apps/customer-relationship-management/index.html index f3a5fbbcf4..e4e39976ea 100644 --- a/apps/customer-relationship-management/index.html +++ b/apps/customer-relationship-management/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Customer Relationship Management

Customer Relationship Management (CRM) is a combination of strategies and technologies used by companies to manage and analyze customer interactions and data throughout the customer lifecycle. The primary goal of CRM is to improve business relationships with customers, assist in customer retention, and drive sales growth. A CRM system helps companies stay connected to customers, streamline processes, and improve profitability.

Key Features:

  1. Contact Management:
    • Record and maintain essential customer details such as name, address, phone number, email, etc.
  2. Sales Opportunity Tracking:
    • Manage potential sales opportunities and monitor the progress of sales activities.
  3. Marketing Automation:
    • Automate marketing tasks and workflows, such as email marketing and social media marketing.
  4. Customer Service and Support:
    • Provide customer service and technical support, manage customer inquiries, and feedback.
  5. Reporting and Analytics:
    • Generate reports on sales, marketing, and customer service activities, offering data-driven insights.
  6. Workflow Automation:
    • Automate daily business processes like approval workflows and task assignments.

Utilizing a CRM system can help businesses enhance their sales efficiency, elevate customer satisfaction, strengthen customer loyalty, and deliver a more personalized customer experience.

- - + + \ No newline at end of file diff --git a/apps/customer-relationship-management/sales/index.html b/apps/customer-relationship-management/sales/index.html index 5108bc98eb..535eee498a 100644 --- a/apps/customer-relationship-management/sales/index.html +++ b/apps/customer-relationship-management/sales/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Steedos Sales Management System

In the competitive landscape of sales, efficiency and customer relationship are key. The Steedos Sales Management System, is designed to empower sales teams with the tools they need for success. Built on the Steedos low-code platform, this system offers a highly customizable and user-friendly experience.

Key Features

  1. Lead and Opportunity Management:

    • Track and manage sales leads and opportunities.
    • Monitor the sales pipeline and forecast sales trends.
  2. Account and Contact Management:

    • Maintain comprehensive records of customers and contacts.
    • Segment customers for targeted marketing and sales efforts.
  3. Activity Tracking:

    • Log and monitor all sales-related activities, including calls, meetings, and emails.
    • Set reminders and follow-up tasks.
  4. Quote and Order Management:

    • Generate quotes and manage orders efficiently.
    • Track order fulfillment and invoicing.
  5. Product and Price Book Management:

    • Manage product catalogs and pricing structures.
    • Set up discounts and promotions.
  6. Reporting and Analytics:

    • Generate real-time reports and dashboards.
    • Gain insights into sales performance and customer behavior.
  7. Mobile Accessibility:

    • Access the system on-the-go with a mobile-friendly interface.
    • Stay connected with your sales team and customers from anywhere.
  8. Integration Capabilities:

    • Seamlessly integrate with other business systems like ERP, marketing automation, and customer service platforms.
  9. Customization and Scalability:

    • Tailor the system to meet your unique business needs.
    • Scale the system as your business grows.

Product Highlights

  • User-Friendly Interface: Designed for ease of use, ensuring quick adoption by sales teams.
  • Customizable Workflows: Adapt the system to your sales processes for maximum efficiency.
  • Data Security and Compliance: Robust security features to protect sensitive sales data.
  • Collaboration Tools: Foster teamwork and communication within the sales team.

The Steedos Sales Management System is not just a tool; it's a sales accelerator. It's designed to streamline your sales processes, enhance customer relationships, and drive revenue growth. Whether you're a small business or a large enterprise, this system is built to adapt to your needs and scale with your success.

- - + + \ No newline at end of file diff --git a/apps/customer-relationship-management/service/index.html b/apps/customer-relationship-management/service/index.html index 853ca5fc6e..1e5608265f 100644 --- a/apps/customer-relationship-management/service/index.html +++ b/apps/customer-relationship-management/service/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Steedos Service Management System

In today's rapidly changing business environment, delivering exceptional customer service is key to success. Steedos Service Management System is designed to provide businesses with a comprehensive service management solution. Built on the Steedos low-code platform, this system offers a highly customizable and user-friendly experience.

Key Features:

  1. Customer Support and Service Request Management:

    • Efficiently track and manage customer support requests and service cases.
    • Automate case assignment and priority setting.
  2. Knowledge Base and Solution Management:

    • Create and maintain a centralized knowledge base to help customers and service representatives quickly find solutions.
    • Manage FAQs and best practice documentation.
  3. Service Contracts and Agreements Management:

    • Manage service contracts and level agreements.
    • Track service levels and customer satisfaction.
  4. Customer Feedback and Satisfaction Surveys:

    • Collect and analyze customer feedback to improve service quality.
    • Implement satisfaction surveys to measure service performance.
  5. Reporting and Analytics:

    • Generate real-time service reports and dashboards.
    • Gain insights into service performance and customer satisfaction trends.
  6. Mobile Accessibility:

    • Access the system on-the-go with a mobile-friendly interface.
    • Respond to customer needs promptly, no matter where you are.
  7. Integration Capabilities:

    • Seamlessly integrate with other business systems like CRM, sales, and marketing automation platforms.
  8. Customization and Scalability:

    • Tailor the system to meet your unique business needs.
    • Scale the system as your business grows.

Product Highlights:

  • User-Friendly Interface: Designed for ease of use, ensuring quick adoption by service teams.
  • Automated Workflows: Adapt the system to your service processes for maximum efficiency.
  • Data Security and Compliance: Robust security features to protect sensitive customer data.
  • Collaboration Tools: Foster teamwork and communication within the service team.

The Steedos Service Management System is not just a tool; it's a service optimizer. It's designed to streamline your service processes, enhance customer satisfaction, and drive customer loyalty. Whether you're a small business or a large enterprise, this system is built to adapt to your needs and scale with your success.

- - + + \ No newline at end of file diff --git a/apps/getting-started/deploy/index.html b/apps/getting-started/deploy/index.html index 314853ab2c..35348bee48 100644 --- a/apps/getting-started/deploy/index.html +++ b/apps/getting-started/deploy/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Self Hosting

Follow these steps to deploy Steedos Apps on Docker.

Prerequisites

  1. Docker (version 20.10.7 or later)
  2. Docker-Compose (version 1.29.2 or later)
  3. Steedos Enterprise License

Install Steedos Apps

Create a folder named steedos-apps on your machine for deployment and data storage. Then, navigate to this folder using the cd command and follow the steps below:

  1. Contact us to request a trial license key.

  2. Create a new file docker-compose.yml

version: "3.9"

services:

steedos-enterprise:
image: steedos/steedos-enterprise:latest
container_name: steedos-enterprise
ports:
- "80:80"
- "443:443"
- "9001:9001"
environment:
- ROOT_URL=http://127.0.0.1
- TRANSPORTER=redis://redis:6379
- CACHER=redis://redis:6379/1
- STEEDOS_LICENSE=trial
- STEEDOS_LOG_LEVEL=info
tty: true
volumes:
- "./storage:/steedos-storage"
depends_on:
redis:
condition: service_started
steedos-apps:
image: steedos/steedos-apps:latest
container_name: steedos-apps
environment:
- TRANSPORTER=redis://redis:6379
- CACHER=redis://redis:6379/1
depends_on:
redis:
condition: service_started
redis:
image: ecr.aws.steedos.cn/dockerhub/redis:6.2
command: "redis-server --save \"\" --appendonly no --loglevel warning"

This saves the file in the current directory.

  1. Start the Docker container using the following command. You may need to run with sudo if you don't have permission to run docker-compose.
docker-compose up -d

If the image doesn't exist locally, this command downloads the necessary Docker image and starts the container.

  1. Open http://localhost and wait for the server to come up. This can take up to 5 minutes. Once the server is up and running, you can access Steedos at http://localhost.

If you continue to face issues, reach out to support@steedos.com.

Further reading

- - + + \ No newline at end of file diff --git a/apps/getting-started/overview/index.html b/apps/getting-started/overview/index.html index 6cc10e962c..a3dd1c725b 100644 --- a/apps/getting-started/overview/index.html +++ b/apps/getting-started/overview/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

What is Low-code App?

In traditional enterprise application development, every feature and module required coding from scratch. This not only consumed a significant amount of time but also incurred high development costs. Moreover, when business requirements changed, modifying and optimizing the application became complex and challenging.

The advent of Low-code App has completely transformed this scenario. Developed based on the Steedos low-code platform and metadata, it means businesses can easily customize and extend the application to meet their unique business needs. Compared to traditional application development, Low-code App offers greater flexibility and scalability.

Low-code driven, easily customizable.

The core advantage of Low-code App lies in its exceptional customizability, enabling every enterprise to build a solution that perfectly matches their unique requirements without the need for complex coding.

  • Personalized Object Model: You can create or modify any data object based on business requirements, ensuring the data structure aligns perfectly with your business model.
  • Granular Permission Management: Allows you to assign specific permissions to different users or user groups, ensuring data security and compliance while meeting the different roles and responsibilities within the organization.
  • Customizable Interface Design: With visual interface design tools, you can flexibly adjust every system interface, ensuring the best user experience.
  • Customizable Automated Processes: From simple task automation to complex business processes, you can easily design and implement, ensuring efficient workflow.
  • In-depth Report Analysis: Offering various report templates, it helps you deeply analyze business data, ensuring you're always updated with the latest business insights.
- - + + \ No newline at end of file diff --git a/apps/human-capital-management/attendance/index.html b/apps/human-capital-management/attendance/index.html index 7db951d722..4fce28226f 100644 --- a/apps/human-capital-management/attendance/index.html +++ b/apps/human-capital-management/attendance/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Attendance Management

Steedos Attendance Management System is an efficient and modern attendance management software, designed specifically to meet the attendance management needs of various enterprises. Developed on the Steedos low-code platform, the system not only inherits the platform's flexibility and high customizability but also supports private deployment, ensuring absolute security and privacy of enterprise data.

Overview

Core Features

  1. Attendance Rule Configuration: Customizable attendance rules to cater to various working hours, shifts, and holiday arrangements.
  2. Clock-in Management: Supports various clock-in methods, including mobile device clock-in and location-based clock-in, catering to both fixed and mobile workspaces.
  3. Leave, Outing, and Business Trip Management: Comprehensive management of leave, outings, and business trips, including application, approval, and recording.
  4. Data Statistics and Analysis: Automatic aggregation and analysis of attendance data, providing clear attendance reports for the management.
  5. Automatic Report Generation: Capability to generate daily, monthly, and annual attendance reports as needed.

Key Highlights

  • Based on Low-code Platform: Leveraging the Steedos low-code platform, the system is highly customizable, quickly adjustable, and can be extended to meet specific needs.
  • Support for Private Deployment: Recognizing the importance of enterprise data, offers private deployment options ensuring data is stored exclusively on the enterprise's servers.
  • Integration Capabilities: Seamless integration with other enterprise systems, such as HR systems, payroll systems, etc., ensuring uninterrupted data flow.
  • User-friendly Interface: A clean and intuitive user interface ensures ease of use for both employees and management.

Attendance Configuration

Setting Attendance Rules

Attendance rules are fundamental to ensuring employees clock in and out on time. With the Steedos Attendance Management System, you can:

  • Set standard working hours.
  • Define tolerance periods for lateness and early departures.
  • Set calculation methods and strategies for overtime.

Configuring Attendance Intervals

For companies with shift systems, setting attendance intervals is crucial. Within the Steedos Attendance Management System, you can:

  • Create multiple shifts, such as morning, afternoon, and night shifts.
  • Define specific start and end times for each shift.
  • Set rest periods and durations for each shift.

Holidays and Special Dates

Setting public holidays and special dates ensures employees adhere to different attendance rules on these dates. Features include:

  • Marking public holidays and company-specific significant dates.
  • Defining specific attendance rules for these special dates, such as whether clock-ins are needed or if working hours are counted.
  • Quickly viewing upcoming special dates to ensure management and employees are prepared in advance.

Clock-in Management

Configuring Clock-in Methods and Locations

To ensure clock-in accuracy, companies can set valid ranges or locations for clock-ins, such as office buildings, factories, etc.

Mobile Device Clock-in

For employees who often travel or work remotely, Steedos offers a mobile device clock-in feature:

  • GPS Location Clock-in: The system records the exact location of the employee during clock-in, ensuring they are at the specified work location.
  • Photo Clock-in: Employees can clock-in by taking a photo of their working environment as proof.
  • Network IP Clock-in: Allows employees to clock-in within a specified network IP range.

This feature requires the installation of related Steedos apps on the employee's mobile device, ensuring the app can access location, camera permissions, etc.

Handling Clock-in Anomalies

Clock-in anomalies refer to situations where employees do not clock in according to stipulated times or locations, including but not limited to tardiness, leaving early, and missed clock-ins. In Steedos:

  • The system automatically flags and logs clock-in anomalies.
  • Administrators or superiors can view an employee's clock-in anomaly records.
  • Employees can provide valid explanations or evidence for their anomalies.
  • Depending on company policies, clock-in anomalies might impact an employee's attendance statistics and performance evaluations.

Leave, Outing, and Business Trip Management

Setting Leave Procedures

To standardize and streamline the leave-taking process, the Steedos Attendance Management System offers comprehensive leave procedure settings:

  • Setting Leave Types: Define different types of leaves, such as personal leave, sick leave, annual leave, etc., based on company policies.
  • Leave Duration Calculation: The system can automatically calculate the leave duration or allow employees to input manually.
  • Reminders & Notifications: Upon an employee's leave application submission, the system can automatically notify the approvers or relevant departments.

Applying for Outings and Business Trips

Outings and business trips are also integral parts of attendance management. Steedos offers a streamlined application process:

  • Reason for Outing/Business Trip: Employees need to provide specific reasons and estimated times for outings or business trips.
  • Associated Documents: Employees can upload related documents or images, such as a business trip plan or meeting notice.
  • Location and Route: For business trips, employees also need to provide the destination and the planned route.

Approval and Status Tracking

To ensure compliance, the Steedos system offers a clear approval workflow for leave, outing, and business trip applications:

  • Defined Approvers: Determine who in the organization has the authority to approve such requests.
  • Approval Procedures: Specify the approval flow, i.e., how the application moves from one approver to the next.
  • Notifications & Reminders: Once an application is approved or rejected, the system will send notifications to the relevant parties.

Summary

In the modern working environment, attendance management is crucial to ensuring productivity and employee satisfaction. Steedos Attendance Management System offers a comprehensive suite of features tailored to meet the needs of diverse enterprises, ensuring that both employees and management can maintain a harmonious working relationship.

- - + + \ No newline at end of file diff --git a/apps/human-capital-management/employee/index.html b/apps/human-capital-management/employee/index.html index 541379013f..066e363fd9 100644 --- a/apps/human-capital-management/employee/index.html +++ b/apps/human-capital-management/employee/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Employee Lifecycle Management System

In modern enterprise management, the Employee Lifecycle Management System (ELMS) plays a crucial role. It not only enhances the efficiency of human resource management but also strengthens employees' sense of belonging and satisfaction. Based on the Steedos low-code platform, we have designed a comprehensive employee lifecycle management system aimed at simplifying and optimizing every stage from onboarding to offboarding.

System Features

  1. Recruitment and Onboarding Management:

    • Automate job posting and resume collection.
    • Streamline interview scheduling and candidate evaluation processes.
    • Provide new employee orientation training and adaptation guidance.
  2. Regularization and Career Development:

    • Set probationary goals and evaluation criteria.
    • Track employee training progress and career development paths.
    • Support employee career planning and internal promotion opportunities.
  3. Transfer and Position Management:

    • Manage internal transfer applications and approval processes.
    • Track position changes and organizational structure adjustments.
    • Keep employee personal information and position information up-to-date.
  4. Offboarding Management:

    • Simplify the resignation application and approval process.
    • Support exit interviews and knowledge handover.
    • Ensure the completeness and compliance of offboarding procedures.

Product Advantages

  • Low-Code Platform: Based on the Steedos low-code platform, quick to deploy, easy to maintain and upgrade.
  • High Customizability: Customize processes and interfaces according to specific enterprise needs.
  • Data-Driven Decision Making: Provide comprehensive data analysis and reporting features to help management make more informed decisions.
  • User-Friendly: Intuitive user interface and operation process, reducing training costs and improving user acceptance.

By implementing this employee lifecycle management system, enterprises can manage human resources more effectively, enhance employee satisfaction, and thereby promote the organization's continuous development and success.

- - + + \ No newline at end of file diff --git a/apps/human-capital-management/index.html b/apps/human-capital-management/index.html index 43524af6cd..34440a49bd 100644 --- a/apps/human-capital-management/index.html +++ b/apps/human-capital-management/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

HCM (Human Capital Management)

HCM, standing for Human Capital Management, is an integrated approach that covers the entire lifecycle of an employee within an organization. It encompasses activities related to recruiting, onboarding, training, performance management, compensation, benefits, and offboarding.

Key components of HCM include:

  • Recruitment Management: This involves job postings, resume screening, interviews, and the overall hiring process.
  • Onboarding: Ensuring smooth integration of new employees into the organization, which includes training, equipment allocation, and other induction procedures.
  • Performance Management: Regularly evaluating employee performance and providing feedback and guidance.
  • Learning and Development: Offering training and development opportunities to help employees enhance their skills and knowledge.
  • Compensation and Benefits Management: Administering employee salaries, bonuses, benefits, and other forms of compensation.
  • Time and Attendance Management: Tracking employee working hours, leaves, and absences.
  • Talent Management: Identifying and nurturing key talents to ensure the long-term success of the organization.
  • Offboarding: Handling the procedures related to employees leaving the organization, including exit interviews and knowledge transfer.

The goal of HCM is to help organizations maximize the value of their employees. This involves ensuring that the skills and capabilities of employees are optimally utilized, and that they receive appropriate training and development opportunities to meet the long-term needs of the organization.

- - + + \ No newline at end of file diff --git a/apps/human-capital-management/performance/index.html b/apps/human-capital-management/performance/index.html index c3cc9b2d34..ab991d600a 100644 --- a/apps/human-capital-management/performance/index.html +++ b/apps/human-capital-management/performance/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Steedos Performance Evaluation System

In the modern corporate landscape, ensuring the continuous growth of a company and the professional development of its employees is paramount. Performance evaluation plays a crucial role in this process. With the Steedos low-code platform, we present a comprehensive solution for performance evaluation, ensuring that each employee's performance is assessed fairly and accurately.

Key Features:

  • Goal Setting & Tracking: Allows employees and managers to collaboratively set clear, measurable performance objectives and monitor progress in real-time.
  • 360-Degree Feedback: Collect feedback from colleagues, subordinates, and superiors to provide a holistic view of performance.
  • Self-Assessment: Employees can conduct self-assessments, comparing them with manager evaluations.
  • Performance Scoring: Based on predefined criteria, score each aspect of an employee's performance.
  • Development Plans: Based on evaluation results, devise personal development and training recommendations for employees.
  • Performance Reporting: Generate performance evaluation reports, assisting management in understanding both overall and individual performance trends.
  • Performance History: Store records of each performance evaluation for easy retrospection and analysis.

Why Choose the Steedos Performance Evaluation System?

  1. Flexibility & Customizability: With the Steedos low-code platform, easily customize and extend system functionalities to meet specific enterprise needs.
  2. Integration & Automation: Seamlessly integrate with other enterprise systems (e.g., HR management, training systems) and support automated workflows, such as auto-reminders and report generation.
  3. Cloud-native & Mobile Support: Offers both cloud and on-premises deployment options, along with mobile applications, ensuring access and management anytime, anywhere.

With the Steedos Performance Evaluation System, companies can efficiently and systematically conduct employee performance evaluations, ensuring transparency and fairness, while continuously providing opportunities for employee development.

- - + + \ No newline at end of file diff --git a/apps/spend-management/contract/index.html b/apps/spend-management/contract/index.html index 8380e9308e..32969b8fe8 100644 --- a/apps/spend-management/contract/index.html +++ b/apps/spend-management/contract/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Steedos Contract Lifecycle Management System

In the modern business landscape, contract management is paramount, impacting a company's profits, compliance, and risk management. Leveraging the Steedos low-code platform, we offer a comprehensive solution for managing the entire lifecycle of a contract, ensuring every phase is efficiently handled.

Key Features

  • Contract Template Library: A collection of predefined contract templates with customization capabilities, ensuring standardized and efficient contract drafting.
  • Dynamic Approval Workflows: Adjusts approval processes based on contract type and value, ensuring compliance.
  • Electronic Signature Integration: Integrated with leading e-signature services, supporting online signing to expedite the contract signing process.
  • Contract Execution Tracking: Real-time monitoring of contract execution status, such as payments and deliveries, ensuring adherence to contract terms.
  • Expiration Alerts & Auto-Renewal: Automated reminders for contract expiration dates with auto-renewal features, ensuring business continuity.
  • Contract Amendment Management: Document and track all contract modifications, ensuring transparency and traceability.
  • Contract Analytics & Reporting: Visualized contract data reports, assisting management in understanding overall contract trends and status.
  • Integration & Automation: Seamless integration with other enterprise systems (e.g., CRM, ERP) and supports automated workflows like auto-invoicing and payments.

Why Choose the Steedos Contract Lifecycle Management System?

  1. Flexibility & Customizability: With the Steedos low-code platform, easily customize and extend system functionalities to meet specific business needs.
  2. Security & Compliance: Multi-layered security measures ensure the safety and privacy of contract data, with support for compliance reporting and audit trails.
  3. Cloud-Native & Mobile Support: Supports both cloud and on-premises deployment, with mobile applications ensuring access and management anytime, anywhere.

With the Steedos Contract Lifecycle Management System, businesses can manage their contracts more efficiently and securely, reducing risks, enhancing contract execution efficiency, and achieving digital and automated contract management.

- - + + \ No newline at end of file diff --git a/apps/spend-management/expense/index.html b/apps/spend-management/expense/index.html index 95a4653c63..86f6491cc9 100644 --- a/apps/spend-management/expense/index.html +++ b/apps/spend-management/expense/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Steedos Expense: Smart, Efficient, One-stop Reimbursement Experience

In daily corporate operations, reimbursement management is often a tedious part of financial tasks. Steedos Expense Solution, based on Steedos' low-code platform, builds a comprehensive, intelligent reimbursement process management system for you, focusing on providing an efficient, standardized reimbursement experience for enterprises.

Introduction

Steedos Expense Solution is a low-code application developed on the Steedos platform, aiming to provide businesses with an efficient, convenient reimbursement management tool. Through this solution, users can easily complete the entire process from reimbursement application, approval to financial payment.

Target Users

This solution mainly targets financial departments, administrative departments of medium to large enterprises, and employees who need reimbursement. Whether it's the headquarters or branches, they can achieve centralized management and auditing through this system.

Core Features

  1. Invoice Scanning & Recognition: Employees only need to scan the invoice, and the system automatically reads and fills in related information, simplifying the data input process.
  2. Authenticity Verification: Automatically verifies the authenticity of scanned invoices, ensuring the compliance and authenticity of each reimbursement.
  3. One-click Reimbursement Submission: Streamlines the reimbursement application process. Employees can easily submit reimbursements with one click, with automated approval routing.
  4. Real-time Approval & Notification: Reimbursement approval is progressed in real-time, with instant notifications to the relevant personnel, avoiding reimbursement delays.
  5. Financial Settlement & Analysis: Automates financial settlement, provides multi-dimensional reimbursement data analysis, aiding financial decisions.

Key Highlights

  1. Flexibility: Based on the Steedos low-code platform, companies can deeply customize according to their business needs.
  2. Automation: Supports invoice scanning recognition and authenticity verification, significantly reducing manual input workload.
  3. Transparency: Every step of the reimbursement process has clear records and tracking, ensuring compliant funds transfer.
  4. Integration: Can easily integrate with other financial, ERP systems for seamless data integration.
  5. Data Security & Confidentiality: Strict data protection measures to ensure the security and privacy of each reimbursement data.
  6. Mobile-friendly: Whether on PC or mobile devices, smooth user experience meets the needs of modern mobile enterprises.

Create a Reimbursement

Preparation

Ensure you have collected and organized all the invoices and related proofs for reimbursement.

Fill in Reimbursement Information

  1. On the "Create Reimbursement" page, fill in the basic reimbursement information, such as reimbursement amount, category, etc.
  2. If it involves travel expenses or hospitality expenses, make sure to fill in detailed travel or hospitality reasons and personnel list.

Invoice Upload & Scan

  1. Choose "Upload Invoice" and take a clear photo of the front side of the invoice.
  2. The system will automatically scan and recognize the invoice, and you only need to confirm if the recognized results are correct.
  3. For manually input invoices, ensure that the entered information matches the details on the invoice.

Submit Reimbursement Application

  1. Check that all the information is complete and ensure that the invoice matches the reimbursement details.
  2. Click the "Submit" button, and your reimbursement application will enter the approval process. You can check the status of your reimbursement in "My Reimbursements" at any time.

Invoice Management

Invoice Scanning & Auto Recognition

Steedos expense management solution supports automatic scanning and recognition of invoices, making the data entry faster and more accurate. Here's how:

  1. In the "Invoice Management" module, choose "Scan Invoice".
  2. Place the front side of the invoice on a clear background for capture or scanning.
  3. Upload the invoice image, and the system will automatically scan and recognize the content of the invoice.
  4. Once recognized, the system will display the recognized invoice information, such as invoice number, amount for user confirmation.

Manual Invoice Entry

Although the auto-recognition feature greatly improves efficiency, you might need to manually input invoice information in certain situations. Here are the steps:

  1. In the "Invoice Management" module, choose "Add Invoice".
  2. Based on the actual content of the invoice, fill in the invoice number, date, amount, buyer, seller, and other relevant information.
  3. If you have a digital version of the invoice image or scanned copy, you can choose to upload it as an attachment.
  4. After ensuring that the entered information is correct, click "Save".

Invoice Authenticity Verification

To ensure compliance in financial management, the Steedos expense management solution also provides an invoice authenticity verification feature. By matching data with the National Taxation Bureau, you can quickly determine the authenticity of the invoice.

  1. In the "Invoice Management" module, select the invoice entry you want to verify.
  2. Click the "Verify Authenticity" button.
  3. The system will automatically compare the data with the National Tax Bureau, and quickly return the verification result.
  4. If the invoice is genuine, you can proceed with the subsequent reimbursement process. If the invoice is fake, the system will flag the invoice and notify the user.

Reimbursement Approval Process

Reimbursement Routing & Notification

Once you submit a reimbursement application, it will be routed based on a pre-set process. Each step in the process might involve one or multiple approvers.

  • After application submission, the system will automatically notify the first approver.
  • The approver can view pending reimbursement applications through email, SMS, or in-system notifications.

Approval Actions & Responses

As an approver, you can take the following actions on a reimbursement application:

  1. Agree: If you find the reimbursement request reasonable, you can choose to agree.
  2. Reject: If you find issues with the reimbursement request, you can choose to reject. When rejecting, you need to provide a reason.
  3. Reply: If you have doubts about the reimbursement content or need further information, you can choose to reply and ask questions.

Reimbursement Modification & Resubmission

If the reimbursement application is rejected, the applicant can modify the reimbursement content based on feedback from the approver:

  1. Access the details page of the rejected reimbursement application.
  2. Modify the relevant content.
  3. Resubmit the reimbursement application.

Reimbursement Status & Inquiry

Check Reimbursement Status

On the "Reimbursement Management" page, you can see the current status of each reimbursement, such as "Pending Approval", "Approved", "Rejected".

Reimbursement Details & History

Click on any reimbursement record to view detailed content of that reimbursement, including:

  • Reimbursement amount
  • Reason for reimbursement
  • Submission date
  • Approval history

Export Reimbursement Records

To export reimbursement records as an electronic document, follow these steps:

  1. On the "Reimbursement Management" page, select the reimbursement records you want to export.
  2. Click the "Export" button.
  3. Choose the export format, such as Excel or PDF.
  4. Confirm the export.

Conclusion

The Steedos Expense Solution, built on the Steedos low-code platform, offers an efficient, streamlined, and standardized process for enterprises. With advanced features like invoice scanning recognition, authenticity verification, and mobile compatibility, this solution not only simplifies the reimbursement process but also brings greater convenience to both financial personnel and employees. Embrace the future of smart financial management with Steedos!

- - + + \ No newline at end of file diff --git a/apps/spend-management/index.html b/apps/spend-management/index.html index c0fd29fc20..40b3e80a65 100644 --- a/apps/spend-management/index.html +++ b/apps/spend-management/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Spend Management

Spend Management refers to the process by which enterprises manage and control all their expenditures, including direct expenses (such as raw materials and production costs) and indirect expenses (such as office supplies, travel, and entertainment costs). The goal of spend management is to reduce costs and improve the financial performance of the enterprise by optimizing procurement processes, negotiating more favorable supplier contracts, implementing cost control measures, and more.

Spend management typically includes the following aspects:

  1. Procurement Management: Ensuring that the enterprise purchases goods and services at the best prices and terms.
  2. Contract Management: Monitoring and managing contracts with suppliers to ensure compliance with contract terms.
  3. Expense Reimbursement: Managing employee travel and other expense reimbursements to ensure reasonableness and compliance.
  4. Budget Control: Monitoring and controlling expenditures in line with the enterprise's budgetary goals.
  5. Supplier Management: Assessing and selecting suppliers, establishing and maintaining good supplier relationships.
  6. Risk Management: Identifying and managing risks associated with expenditures, such as supplier risks, price fluctuation risks, etc.
  7. Data Analysis: Using data analysis tools to identify cost-saving opportunities and optimize expenditures.

Spend management not only helps in reducing costs but also improves operational efficiency and financial transparency of the enterprise, thereby supporting strategic decision-making for the enterprise.

- - + + \ No newline at end of file diff --git a/apps/spend-management/invoice/index.html b/apps/spend-management/invoice/index.html index 6fb81c7bb5..ec3e79ad38 100644 --- a/apps/spend-management/invoice/index.html +++ b/apps/spend-management/invoice/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Steedos Invoice Management System

In modern enterprise management, invoice processing is a key financial process. The Steedos Invoice Management System is a solution developed on a low-code platform, designed to simplify and automate the invoice processing workflow, increase efficiency, reduce errors, and ensure financial compliance.

Core Features

  1. Invoice Entry: Supports manual and automatic entry of invoice information (via scanning or email), reducing the workload of manual input.
  2. Invoice Verification: Automatically verifies the accuracy of invoice information, including supplier details, amounts, tax rates, etc.
  3. Invoice Approval Workflow: Customizable and flexible approval workflows to ensure that each invoice undergoes proper review and approval.
  4. Invoice Matching: Matches invoices with related purchase orders and receiving records to ensure the accuracy and completeness of invoices.
  5. Payment Processing: Automatically triggers the payment process after invoice approval, supporting multiple payment methods.
  6. Tax Compliance: Automatically calculates and reports tax information, ensuring compliance with local tax regulations.
  7. Data Analysis and Reporting: Provides real-time financial reporting and analysis to help businesses better understand and manage their invoices and expenditures.
  8. Integration and Extensibility: Integrates with other financial systems (such as ERP, accounting software, etc.) and allows for expansion through plugins or APIs.

Advantages

  • Increased Efficiency: The automated invoice processing workflow significantly reduces the time and errors associated with manual operations.
  • Enhanced Visibility: Real-time data analysis and reporting provide deep insights into business expenditures.
  • Ensured Compliance: Automated tax calculations and approval workflows ensure that businesses comply with all relevant financial and tax regulations.
  • Flexibility and Extensibility: The design based on a low-code platform makes the system easy to customize and expand to meet the ever-changing needs of businesses.

The Steedos Invoice Management System is a tailor-made solution for modern enterprises, aimed at enhancing the efficiency and transparency of financial management through technological innovation.

- - + + \ No newline at end of file diff --git a/apps/spend-management/project/index.html b/apps/spend-management/project/index.html index 1c2011ae1d..58fb77a514 100644 --- a/apps/spend-management/project/index.html +++ b/apps/spend-management/project/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Project Cost Management System

The Project Cost Management System is an application developed on the Steedos low-code platform, designed to help businesses effectively track and manage project costs. This system offers a comprehensive set of tools for monitoring project budgets, actual expenditures, labor costs, travel expenses, etc., ensuring that project costs are kept within budget, thereby enhancing project profitability and management efficiency.

Overview

By using the Project Cost Management System, businesses can more effectively control project costs, improve project profitability and management efficiency, and thus gain an advantage in the fierce market competition.

Core Features

  1. Project Budget Management: Set project budgets, including labor costs, material expenses, travel expenses, etc., to ensure project costs are controlled within budget limits.
  2. Expense Tracking: Record and track all expenses related to the project, including direct and indirect costs, and update the project cost status in real-time.
  3. Labor Cost Management: Track the working hours of project team members, calculate labor costs, and analyze the efficiency of human resource utilization.
  4. Travel Expense Management: Manage the travel expenses of the project team, including transportation, accommodation, meals, etc., ensuring that travel expenses are reasonable and transparent.
  5. Contract Management: Manage all contracts related to the project, including supplier contracts, procurement contracts, etc., to ensure the execution of contract terms.
  6. Reporting and Analysis: Provide rich reporting and analysis tools to help management understand the project cost status and make more informed decisions.
  7. Alert Mechanism: When project costs exceed the budget or approach the budget limit, the system automatically issues alerts to help project managers take timely measures.
  8. Integration and Extensibility: The system can be integrated with other enterprise applications (such as financial systems, human resource systems, etc.) to provide a more comprehensive project cost management.

Application Scenarios

  • IT companies managing the cost expenditures of software projects.
  • Construction companies managing the costs of engineering projects.
  • Manufacturing enterprises managing the costs of product development projects.
  • Consulting firms managing the costs of client projects.
- - + + \ No newline at end of file diff --git a/apps/spend-management/supplier/index.html b/apps/spend-management/supplier/index.html index 367ee468a5..8dc3229a3e 100644 --- a/apps/spend-management/supplier/index.html +++ b/apps/spend-management/supplier/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Steedos Supplier Management System

In today's globalized business environment, selecting the right suppliers and maintaining good supplier relationships is crucial. The Steedos Supplier Management System offers businesses a centralized solution to systematically manage supplier information, evaluate their qualifications, and optimize interactions with them.

Key Features:

  1. Supplier Information Management:

    • Input and update basic supplier details such as company name, address, contact information, etc.
  2. Qualification Review:

    • Evaluate the documentation provided by suppliers, including company credentials, business licenses, product or service quality certificates, etc.
    • Set review standards and processes to ensure suppliers meet the company's requirements.
  3. Onboarding Process:

    • Define supplier onboarding criteria and processes.
    • Includes initial cooperation negotiations, price and contract term discussions, pilot projects, or sample testing.
  4. Evaluation and Scoring:

    • Conduct regular supplier evaluations.
    • Score suppliers based on various criteria.
  5. Reporting and Analysis:

    • Auto-generate supplier performance reports.
    • Analyze supplier data to provide insights and recommendations.

Product Highlights:

  • User-friendly Interface: A clear and intuitive interface design allows users to navigate and use the system with ease.
  • High Customizability: Built on the Steedos low-code platform, businesses can customize the system according to their needs.
  • Integration Capabilities: Easily integrates with other enterprise systems (e.g., ERP, financial software).
  • Data Security and Compliance: Offers multi-level security measures to ensure the safety and compliance of supplier data.

The Steedos Supplier Management System provides businesses with a comprehensive tool to manage supplier relationships more efficiently and systematically. Whether you're an SME or a large multinational corporation, this system can assist you in optimizing your supply chain and maximizing value.

- - + + \ No newline at end of file diff --git a/apps/spend-management/tender/index.html b/apps/spend-management/tender/index.html index 5a630ad973..ee8092ed15 100644 --- a/apps/spend-management/tender/index.html +++ b/apps/spend-management/tender/index.html @@ -15,13 +15,13 @@ - - + +
Skip to main content

Steedos Tender Management System

The Steedos Tender Management System, developed on the Steedos low-code platform, is a highly customizable solution designed to streamline the tendering process for businesses and government agencies. It aims to simplify the tendering workflow, enhance efficiency and transparency, and ensure fairness and compliance in tendering activities.

Key Features

1. Tender Project Management

  • Easily create and manage tender projects.
  • Customize tendering processes and rules.
  • Track project progress and status updates.

2. Tender Announcement Publication

  • Design and publish tender announcements.
  • Utilize various announcement templates for quick document generation.
  • Set announcement release dates and bidding deadlines.

3. Bid Document Management

  • Securely store and manage all bid documents.
  • Support for uploading and downloading various file formats.
  • Offer version control and audit tracking for documents.

4. Supplier Management

  • Register and manage supplier information.
  • Automatically verify supplier qualifications and past performance.
  • Allow suppliers to self-register and update their details.

5. Bid Evaluation & Decision Support

  • Set evaluation criteria and scoring systems.
  • Support online bid evaluations and record evaluation meetings.
  • Provide statistical analysis of bid results.

6. Contract Award & Management

  • Automatically generate award notices and contract documents.
  • Publish award results online.
  • Manage changes and extensions during contract execution.

7. System Security & Audit

  • Implement strict permission controls and user authentication.
  • Maintain comprehensive operation logs and audit trails.
  • Support data backups and disaster recovery.

System Benefits

  • High Customizability: Built on the Steedos low-code platform, it can be quickly customized to fit specific organizational needs.
  • Efficiency Boost: Automated processes significantly reduce manual operations, enhancing tendering efficiency.
  • Enhanced Transparency: All tendering information and processes are conducted online, ensuring openness and transparency.
  • Risk Mitigation: Security measures and audit functions help prevent fraudulent activities and reduce tendering risks.
  • Centralized Management: Centralize all tendering activities for better oversight and control.

The Steedos Tender Management System is the ideal tool for businesses and government agencies to conduct their tendering activities. It not only improves the efficiency and transparency of the tendering process but also helps users mitigate risks and elevate their management standards.

- - + + \ No newline at end of file diff --git a/assets/js/125d8b5f.13c22f0f.js b/assets/js/125d8b5f.1f383d27.js similarity index 82% rename from assets/js/125d8b5f.13c22f0f.js rename to assets/js/125d8b5f.1f383d27.js index 56efecbb2d..aad06a6482 100644 --- a/assets/js/125d8b5f.13c22f0f.js +++ b/assets/js/125d8b5f.1f383d27.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9062],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},s=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=l(r),m=o,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return r?n.createElement(f,p(p({ref:t},s),{},{components:r})):n.createElement(f,p({ref:t},s))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,p=new Array(a);p[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:o,p[1]=i;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={title:"OpenAPI",sidebar_position:30},p=void 0,i={unversionedId:"developer/api/openapi",id:"developer/api/openapi",title:"OpenAPI",description:"- OpenAPI API Documentation",source:"@site/docs/developer/api/openapi.mdx",sourceDirName:"developer/api",slug:"/developer/api/openapi",permalink:"/developer/api/openapi",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/developer/api/openapi.mdx",tags:[],version:"current",sidebarPosition:30,frontMatter:{title:"OpenAPI",sidebar_position:30},sidebar:"developer",previous:{title:"GraphQL API",permalink:"/developer/api/graphql-api"},next:{title:"SSO API",permalink:"/developer/api/api-jwt-sso"}},c={},l=[],s={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://docs.steedos.com/openapi/records/index.html#tag/service_records"},"OpenAPI API Documentation")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/steedos/steedos-docs/blob/master/openapi/records.yaml"},"OpenAPI specification"))))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9062],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function p(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var c=n.createContext({}),l=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):p(p({},t),e)),r},s=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),u=l(r),m=o,f=u["".concat(c,".").concat(m)]||u[m]||d[m]||a;return r?n.createElement(f,p(p({ref:t},s),{},{components:r})):n.createElement(f,p({ref:t},s))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,p=new Array(a);p[0]=m;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[u]="string"==typeof e?e:o,p[1]=i;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var n=r(7462),o=(r(7294),r(3905));const a={title:"OpenAPI",sidebar_position:30},p=void 0,i={unversionedId:"developer/api/openapi",id:"developer/api/openapi",title:"OpenAPI",description:"- OpenAPI API Documentation",source:"@site/docs/developer/api/openapi.mdx",sourceDirName:"developer/api",slug:"/developer/api/openapi",permalink:"/developer/api/openapi",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/developer/api/openapi.mdx",tags:[],version:"current",sidebarPosition:30,frontMatter:{title:"OpenAPI",sidebar_position:30},sidebar:"developer",previous:{title:"GraphQL API",permalink:"/developer/api/graphql-api"},next:{title:"Process API",permalink:"/developer/api/api-process"}},c={},l=[],s={toc:l},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,n.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://docs.steedos.com/openapi/records/index.html#tag/service_records"},"OpenAPI API Documentation")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/steedos/steedos-docs/blob/master/openapi/records.yaml"},"OpenAPI specification"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/294ac9d5.17a314bb.js b/assets/js/294ac9d5.17a314bb.js deleted file mode 100644 index cd433f215b..0000000000 --- a/assets/js/294ac9d5.17a314bb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8856],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var i=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=i.createContext({}),u=function(e){var t=i.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},p=function(e){var t=u(e.components);return i.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},g=i.forwardRef((function(e,t){var n=e.components,o=e.mdxType,s=e.originalType,l=e.parentName,p=r(e,["components","mdxType","originalType","parentName"]),c=u(n),g=o,m=c["".concat(l,".").concat(g)]||c[g]||d[g]||s;return n?i.createElement(m,a(a({ref:t},p),{},{components:n})):i.createElement(m,a({ref:t},p))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var s=n.length,a=new Array(s);a[0]=g;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r[c]="string"==typeof e?e:o,a[1]=r;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>r,toc:()=>u});var i=n(7462),o=(n(7294),n(3905));const s={},a="Steedos Plugins",r={unversionedId:"plugins",id:"plugins",title:"Steedos Plugins",description:"Steedos is a potent low-code development platform that empowers users and developers to extend and enhance the platform's capabilities through its flexible plugin architecture. With Steedos plugins, you can integrate new functionalities seamlessly, meet specific business needs, while maintaining the stability and reliability of the core system.",source:"@site/docs/plugins.md",sourceDirName:".",slug:"/plugins",permalink:"/plugins",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/plugins.md",tags:[],version:"current",frontMatter:{},sidebar:"platform",previous:{title:"Node-Red",permalink:"/integration/node-red"},next:{title:"DingTalk",permalink:"/plugins/integration-ding"}},l={},u=[{value:"What are Steedos Plugins?",id:"what-are-steedos-plugins",level:2},{value:"Advantages of Steedos Plugins",id:"advantages-of-steedos-plugins",level:2},{value:"Functional Expansion",id:"functional-expansion",level:3},{value:"Customized Integrations",id:"customized-integrations",level:3},{value:"Ease of Maintenance",id:"ease-of-maintenance",level:3},{value:"Community and Marketplace Support",id:"community-and-marketplace-support",level:3},{value:"Developing Your Own Steedos Plugins",id:"developing-your-own-steedos-plugins",level:2}],p={toc:u},c="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(c,(0,i.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"steedos-plugins"},"Steedos Plugins"),(0,o.kt)("p",null,"Steedos is a potent low-code development platform that empowers users and developers to extend and enhance the platform's capabilities through its flexible plugin architecture. With Steedos plugins, you can integrate new functionalities seamlessly, meet specific business needs, while maintaining the stability and reliability of the core system."),(0,o.kt)("h2",{id:"what-are-steedos-plugins"},"What are Steedos Plugins?"),(0,o.kt)("p",null,"Steedos packages are independent software packages containing a set of predefined functionalities or services that can be directly integrated into the Steedos platform. These plugins can range from custom objects, user interfaces, business logic processing, or integrations with external systems, allowing for rapid expansion and customization of platform functionalities."),(0,o.kt)("h2",{id:"advantages-of-steedos-plugins"},"Advantages of Steedos Plugins"),(0,o.kt)("h3",{id:"functional-expansion"},"Functional Expansion"),(0,o.kt)("p",null,"Steedos Packages enable you to add specific functionalities that are outside the core capabilities of Steedos. Whether it's enhancing data processing capabilities, improving the user interface, or adding new reporting or analytical tools, plugins make all of this possible."),(0,o.kt)("h3",{id:"customized-integrations"},"Customized Integrations"),(0,o.kt)("p",null,"If your business processes require integration with third-party services or other enterprise applications, Steedos plugins allow you to do so with ease. Steedos Packages can encapsulate communications with other systems, ensuring data synchronization and business process continuity."),(0,o.kt)("h3",{id:"ease-of-maintenance"},"Ease of Maintenance"),(0,o.kt)("p",null,"The independence of plugins makes maintenance simpler. You can update or modify a plugin without impacting other parts of the system. This modular approach reduces complexity in system upgrades and troubleshooting."),(0,o.kt)("h3",{id:"community-and-marketplace-support"},"Community and Marketplace Support"),(0,o.kt)("p",null,"Due to the open nature of Steedos, many developers and partners develop and share their plugins. You can benefit from a rich plugin ecosystem, quickly finding solutions that fit your current needs."),(0,o.kt)("h2",{id:"developing-your-own-steedos-plugins"},"Developing Your Own Steedos Plugins"),(0,o.kt)("p",null,"For developers looking to create custom features, Steedos provides the necessary development kit and documentation. You can follow the guidelines in the documentation to create, test, and publish your packages, bringing value to your business or the Steedos community."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/294ac9d5.c3260721.js b/assets/js/294ac9d5.c3260721.js new file mode 100644 index 0000000000..eaa2a8e3ad --- /dev/null +++ b/assets/js/294ac9d5.c3260721.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8856],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},g=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),p=c(n),g=i,f=p["".concat(l,".").concat(g)]||p[g]||d[g]||o;return n?r.createElement(f,s(s({ref:t},u),{},{components:n})):r.createElement(f,s({ref:t},u))}));function f(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=g;var a={};for(var l in t)hasOwnProperty.call(t,l)&&(a[l]=t[l]);a.originalType=e,a[p]="string"==typeof e?e:i,s[1]=a;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var r=n(7462),i=(n(7294),n(3905));const o={},s="Steedos Plugins",a={unversionedId:"plugins",id:"plugins",title:"Steedos Plugins",description:"Steedos is a potent low-code development platform that empowers users and developers to extend and enhance the platform's capabilities through its flexible plugin architecture. With Steedos plugins, you can integrate new functionalities seamlessly, meet specific business needs, while maintaining the stability and reliability of the core system.",source:"@site/docs/plugins.md",sourceDirName:".",slug:"/plugins",permalink:"/plugins",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/plugins.md",tags:[],version:"current",frontMatter:{},sidebar:"platform",previous:{title:"Trigger managed permissions",permalink:"/admin/permissions/before-find"},next:{title:"DingTalk",permalink:"/plugins/integration-ding"}},l={},c=[{value:"What are Steedos Plugins?",id:"what-are-steedos-plugins",level:2},{value:"Developing Your Own Steedos Plugins",id:"developing-your-own-steedos-plugins",level:2}],u={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,i.kt)(p,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"steedos-plugins"},"Steedos Plugins"),(0,i.kt)("p",null,"Steedos is a potent low-code development platform that empowers users and developers to extend and enhance the platform's capabilities through its flexible plugin architecture. With Steedos plugins, you can integrate new functionalities seamlessly, meet specific business needs, while maintaining the stability and reliability of the core system."),(0,i.kt)("h2",{id:"what-are-steedos-plugins"},"What are Steedos Plugins?"),(0,i.kt)("p",null,"Steedos packages are independent software packages containing a set of predefined functionalities or services that can be directly integrated into the Steedos platform. These plugins can range from custom objects, user interfaces, business logic processing, or integrations with external systems, allowing for rapid expansion and customization of platform functionalities."),(0,i.kt)("h2",{id:"developing-your-own-steedos-plugins"},"Developing Your Own Steedos Plugins"),(0,i.kt)("p",null,"For developers looking to create custom features, Steedos provides the necessary development kit and documentation. You can follow the guidelines in the documentation to create, test, and publish your packages, bringing value to your business or the Steedos community."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4a34ebd0.40dcf736.js b/assets/js/4a34ebd0.40dcf736.js deleted file mode 100644 index 8e588d11c6..0000000000 --- a/assets/js/4a34ebd0.40dcf736.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[2218],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),l=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(r),f=a,y=d["".concat(s,".").concat(f)]||d[f]||p[f]||o;return r?n.createElement(y,i(i({ref:t},u),{},{components:r})):n.createElement(y,i({ref:t},u))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=f;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[d]="string"==typeof e?e:a,i[1]=c;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var n=r(7462),a=(r(7294),r(3905));const o={},i="External Data Sources",c={unversionedId:"integration/external-datasources",id:"integration/external-datasources",title:"External Data Sources",description:"An external data source specifies how to access an external system. External data sources have associated external objects, which your users and the Steedos platform use to interact with the external data and content.",source:"@site/docs/integration/external-datasources.md",sourceDirName:"integration",slug:"/integration/external-datasources",permalink:"/integration/external-datasources",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/integration/external-datasources.md",tags:[],version:"current",frontMatter:{},sidebar:"platform",previous:{title:"Extend the Reach of Your Organization",permalink:"/integration"},next:{title:"Node-Red",permalink:"/integration/node-red"}},s={},l=[{value:"Validate and Sync an External Data Source",id:"validate-and-sync-an-external-data-source",level:2}],u={toc:l},d="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"external-data-sources"},"External Data Sources"),(0,a.kt)("p",null,"An external data source specifies how to access an external system. External data sources have associated external objects, which your users and the Steedos platform use to interact with the external data and content."),(0,a.kt)("h2",{id:"validate-and-sync-an-external-data-source"},"Validate and Sync an External Data Source"),(0,a.kt)("p",null,"After you configure an external data source, synchronize it to map its tables with external objects in your Steedos org. The content and data of external objects appear in federated search, together with your Steedos content and data."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Available on: Enterprise Edition")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/54f2501d.0afe4b91.js b/assets/js/54f2501d.0afe4b91.js deleted file mode 100644 index 91d3eed665..0000000000 --- a/assets/js/54f2501d.0afe4b91.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[200],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>b});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=o.createContext({}),c=function(e){var t=o.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},l=function(e){var t=c(e.components);return o.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=r,b=p["".concat(u,".").concat(m)]||p[m]||d[m]||i;return n?o.createElement(b,a(a({ref:t},l),{},{components:n})):o.createElement(b,a({ref:t},l))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=m;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[p]="string"==typeof e?e:r,a[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var o=n(7462),r=(n(7294),n(3905));const i={title:"Custom Button"},a=void 0,s={unversionedId:"no-code/customize/button",id:"no-code/customize/button",title:"Custom Button",description:"Create custom buttons for objects and design button functions using Amis.",source:"@site/docs/no-code/customize/button.mdx",sourceDirName:"no-code/customize",slug:"/no-code/customize/button",permalink:"/no-code/customize/button",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/no-code/customize/button.mdx",tags:[],version:"current",frontMatter:{title:"Custom Button"},sidebar:"platform",previous:{title:"Object Relationships",permalink:"/no-code/customize/object-relationship"},next:{title:"List Views",permalink:"/no-code/customize/listview"}},u={},c=[{value:"Steps",id:"steps",level:2},{value:"Create a New Button",id:"create-a-new-button",level:3},{value:"Design Button",id:"design-button",level:3}],l={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,o.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Create custom buttons for objects and design button functions using Amis."),(0,r.kt)("h2",{id:"steps"},"Steps"),(0,r.kt)("p",null,"The following steps describe how to create custom buttons for business objects in Steedos."),(0,r.kt)("h3",{id:"create-a-new-button"},"Create a New Button"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},'First, go to the "Settings" app and find the object for which you need a custom button.'),(0,r.kt)("li",{parentName:"ol"},'Go to the detail page of the object and find the "Action Buttons" tab.'),(0,r.kt)("li",{parentName:"ol"},'Click the "New" button in the upper right corner to start creating a new custom button.')),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Api Name: Please enter an Api name that does not duplicate with others."),(0,r.kt)("li",{parentName:"ul"},"Display Name: Please enter the display name of the button."),(0,r.kt)("li",{parentName:"ul"},"Display Location: You can choose different display locations such as on the list page or detail page."),(0,r.kt)("li",{parentName:"ul"},"Status: Controls whether the button is enabled."),(0,r.kt)("li",{parentName:"ul"},"Type: Defaults to Amis Button, no need to change."),(0,r.kt)("li",{parentName:"ul"},"Parent Object: Defaults to the current object, no need to change.")),(0,r.kt)("h3",{id:"design-button"},"Design Button"),(0,r.kt)("p",null,'After the button is created, go into the detail page of the newly created button record. Click the "Designer" button in the upper right corner to design and develop the button\'s business logic.'))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/54f2501d.5a7d2698.js b/assets/js/54f2501d.5a7d2698.js new file mode 100644 index 0000000000..b02f258e1b --- /dev/null +++ b/assets/js/54f2501d.5a7d2698.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[200],{3905:(e,t,n)=>{n.d(t,{Zo:()=>l,kt:()=>b});var o=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var u=o.createContext({}),c=function(e){var t=o.useContext(u),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},l=function(e){var t=c(e.components);return o.createElement(u.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,u=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=r,b=p["".concat(u,".").concat(m)]||p[m]||d[m]||a;return n?o.createElement(b,i(i({ref:t},l),{},{components:n})):o.createElement(b,i({ref:t},l))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var s={};for(var u in t)hasOwnProperty.call(t,u)&&(s[u]=t[u]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var o=n(7462),r=(n(7294),n(3905));const a={title:"Custom Button"},i=void 0,s={unversionedId:"no-code/customize/button",id:"no-code/customize/button",title:"Custom Button",description:"Create custom buttons for objects and design button functions using Amis.",source:"@site/docs/no-code/customize/button.mdx",sourceDirName:"no-code/customize",slug:"/no-code/customize/button",permalink:"/no-code/customize/button",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/no-code/customize/button.mdx",tags:[],version:"current",frontMatter:{title:"Custom Button"},sidebar:"platform",previous:{title:"Object Relationships",permalink:"/no-code/customize/object-relationship"},next:{title:"External Data Sources",permalink:"/no-code/customize/external-datasources"}},u={},c=[{value:"Steps",id:"steps",level:2},{value:"Create a New Button",id:"create-a-new-button",level:3},{value:"Design Button",id:"design-button",level:3}],l={toc:c},p="wrapper";function d(e){let{components:t,...n}=e;return(0,r.kt)(p,(0,o.Z)({},l,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Create custom buttons for objects and design button functions using Amis."),(0,r.kt)("h2",{id:"steps"},"Steps"),(0,r.kt)("p",null,"The following steps describe how to create custom buttons for business objects in Steedos."),(0,r.kt)("h3",{id:"create-a-new-button"},"Create a New Button"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},'First, go to the "Settings" app and find the object for which you need a custom button.'),(0,r.kt)("li",{parentName:"ol"},'Go to the detail page of the object and find the "Action Buttons" tab.'),(0,r.kt)("li",{parentName:"ol"},'Click the "New" button in the upper right corner to start creating a new custom button.')),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Api Name: Please enter an Api name that does not duplicate with others."),(0,r.kt)("li",{parentName:"ul"},"Display Name: Please enter the display name of the button."),(0,r.kt)("li",{parentName:"ul"},"Display Location: You can choose different display locations such as on the list page or detail page."),(0,r.kt)("li",{parentName:"ul"},"Status: Controls whether the button is enabled."),(0,r.kt)("li",{parentName:"ul"},"Type: Defaults to Amis Button, no need to change."),(0,r.kt)("li",{parentName:"ul"},"Parent Object: Defaults to the current object, no need to change.")),(0,r.kt)("h3",{id:"design-button"},"Design Button"),(0,r.kt)("p",null,'After the button is created, go into the detail page of the newly created button record. Click the "Designer" button in the upper right corner to design and develop the button\'s business logic.'))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7a331794.24e7a150.js b/assets/js/7a331794.b110cfd3.js similarity index 51% rename from assets/js/7a331794.24e7a150.js rename to assets/js/7a331794.b110cfd3.js index 006230a685..db4a42b0ed 100644 --- a/assets/js/7a331794.24e7a150.js +++ b/assets/js/7a331794.b110cfd3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8281],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function s(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=o.createContext({}),l=function(e){var t=o.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=l(e.components);return o.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,c=e.parentName,u=a(e,["components","mdxType","originalType","parentName"]),d=l(r),m=n,y=d["".concat(c,".").concat(m)]||d[m]||p[m]||i;return r?o.createElement(y,s(s({ref:t},u),{},{components:r})):o.createElement(y,s({ref:t},u))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,s=new Array(i);s[0]=m;var a={};for(var c in t)hasOwnProperty.call(t,c)&&(a[c]=t[c]);a.originalType=e,a[d]="string"==typeof e?e:n,s[1]=a;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=r(7462),n=(r(7294),r(3905));const i={},s="List Views",a={unversionedId:"no-code/customize/listview",id:"no-code/customize/listview",title:"List Views",description:"View, edit, and create records from a list. List views are a great way to sort, prioritize, and analyze the records that are most important to users.",source:"@site/docs/no-code/customize/listview.md",sourceDirName:"no-code/customize",slug:"/no-code/customize/listview",permalink:"/no-code/customize/listview",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/no-code/customize/listview.md",tags:[],version:"current",frontMatter:{},sidebar:"platform",previous:{title:"Custom Button",permalink:"/no-code/customize/button"},next:{title:"Page Layouts",permalink:"/no-code/customize/page-layout"}},c={},l=[],u={toc:l},d="wrapper";function p(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"list-views"},"List Views"),(0,n.kt)("p",null,"View, edit, and create records from a list. List views are a great way to sort, prioritize, and analyze the records that are most important to users."),(0,n.kt)("p",null,"In a list view, you see only the data that you have access to. You can see records that you own, have read or write access to, or are shared with you. List views also include records owned by or shared with users in roles below you in the hierarchy. The fields you see depend on your page layout and field-level security settings."),(0,n.kt)("p",null,"Modify and create list views from your record home page with List View Controls Settings icon. To change and reorder the columns displayed in a list view, select Select Fields to Display. Fields correspond to columns in the final list view."))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[8281],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=o.createContext({}),l=function(e){var t=o.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=l(e.components);return o.createElement(c.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},m=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=l(r),m=n,y=d["".concat(c,".").concat(m)]||d[m]||p[m]||i;return r?o.createElement(y,a(a({ref:t},u),{},{components:r})):o.createElement(y,a({ref:t},u))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,a=new Array(i);a[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s[d]="string"==typeof e?e:n,a[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var o=r(7462),n=(r(7294),r(3905));const i={},a="List Views",s={unversionedId:"no-code/customize/listview",id:"no-code/customize/listview",title:"List Views",description:"View, edit, and create records from a list. List views are a great way to sort, prioritize, and analyze the records that are most important to users.",source:"@site/docs/no-code/customize/listview.md",sourceDirName:"no-code/customize",slug:"/no-code/customize/listview",permalink:"/no-code/customize/listview",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/no-code/customize/listview.md",tags:[],version:"current",frontMatter:{},sidebar:"platform",previous:{title:"External Data Sources",permalink:"/no-code/customize/external-datasources"},next:{title:"Page Layouts",permalink:"/no-code/customize/page-layout"}},c={},l=[],u={toc:l},d="wrapper";function p(e){let{components:t,...r}=e;return(0,n.kt)(d,(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"list-views"},"List Views"),(0,n.kt)("p",null,"View, edit, and create records from a list. List views are a great way to sort, prioritize, and analyze the records that are most important to users."),(0,n.kt)("p",null,"In a list view, you see only the data that you have access to. You can see records that you own, have read or write access to, or are shared with you. List views also include records owned by or shared with users in roles below you in the hierarchy. The fields you see depend on your page layout and field-level security settings."),(0,n.kt)("p",null,"Modify and create list views from your record home page with List View Controls Settings icon. To change and reorder the columns displayed in a list view, select Select Fields to Display. Fields correspond to columns in the final list view."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7d6e9cc6.a4e0d4e7.js b/assets/js/7d6e9cc6.a4e0d4e7.js deleted file mode 100644 index 2e0dd33545..0000000000 --- a/assets/js/7d6e9cc6.a4e0d4e7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[4961],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>g});var o=n(7294);function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(s[n]=e[n]);return s}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s}var d=o.createContext({}),l=function(e){var t=o.useContext(d),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=l(e.components);return o.createElement(d.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,s=e.mdxType,a=e.originalType,d=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=l(n),h=s,g=p["".concat(d,".").concat(h)]||p[h]||u[h]||a;return n?o.createElement(g,r(r({ref:t},c),{},{components:n})):o.createElement(g,r({ref:t},c))}));function g(e,t){var n=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var a=n.length,r=new Array(a);r[0]=h;var i={};for(var d in t)hasOwnProperty.call(t,d)&&(i[d]=t[d]);i.originalType=e,i[p]="string"==typeof e?e:s,r[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var o=n(7462),s=(n(7294),n(3905));const a={title:"Node-Red"},r=void 0,i={unversionedId:"integration/node-red",id:"integration/node-red",title:"Node-Red",description:"Node-RED is a process-oriented programming tool that allows you to effortlessly connect IoT devices, APIs and online services together. It employs a browser-based editor which allows users to drag and drop different nodes onto a canvas, and connect them to create a flow. Node-RED also offers a plethora of nodes which enable users to easily interact with a diverse range of devices and services.https://Node-Red.org/\u3002",source:"@site/docs/integration/node-red.mdx",sourceDirName:"integration",slug:"/integration/node-red",permalink:"/integration/node-red",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/integration/node-red.mdx",tags:[],version:"current",frontMatter:{title:"Node-Red"},sidebar:"platform",previous:{title:"External Data Sources",permalink:"/integration/external-datasources"},next:{title:"Steedos Plugins",permalink:"/plugins"}},d={},l=[{value:"Integrating a Node-RED project",id:"integrating-a-node-red-project",level:2},{value:"Developing an application",id:"developing-an-application",level:3},{value:"Executing",id:"executing",level:3},{value:"Static Resource Storage",id:"static-resource-storage",level:3},{value:"Initialization Configuration",id:"initialization-configuration",level:3},{value:"Flow Designer",id:"flow-designer",level:2},{value:"Steedos Node",id:"steedos-node",level:2},{value:"steedos-event",id:"steedos-event",level:3},{value:"steedos-emit",id:"steedos-emit",level:3},{value:"steedos-call",id:"steedos-call",level:3},{value:"steedos-request",id:"steedos-request",level:3},{value:"steedos-response",id:"steedos-response",level:3},{value:"steedos-api-gw",id:"steedos-api-gw",level:3},{value:"steedos-instance",id:"steedos-instance",level:3},{value:"To invoke GraphQL",id:"to-invoke-graphql",level:2},{value:"To invoke ObjectQL",id:"to-invoke-objectql",level:2},{value:"Invoke using msg.call",id:"invoke-using-msgcall",level:3},{value:"Invoke using a broker",id:"invoke-using-a-broker",level:3},{value:"Trigger",id:"trigger",level:2}],c={toc:l},p="wrapper";function u(e){let{components:t,...a}=e;return(0,s.kt)(p,(0,o.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"Node-RED is a process-oriented programming tool that allows you to effortlessly connect IoT devices, APIs and online services together. It employs a browser-based editor which allows users to drag and drop different nodes onto a canvas, and connect them to create a flow. Node-RED also offers a plethora of nodes which enable users to easily interact with a diverse range of devices and services.",(0,s.kt)("a",{parentName:"p",href:"https://node-red.org/"},"https://Node-Red.org/"),"\u3002"),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"Available on: Professional Edition")),(0,s.kt)("h2",{id:"integrating-a-node-red-project"},"Integrating a Node-RED project"),(0,s.kt)("h3",{id:"developing-an-application"},"Developing an application"),(0,s.kt)("p",null,"Reference to\uff1a",(0,s.kt)("a",{parentName:"p",href:"https://gitlab.steedos.cn/steedos/steedos-project-template.git"},"steedos-project-template.git")),(0,s.kt)("h3",{id:"executing"},"Executing"),(0,s.kt)("p",null,"We can see the package.json file in the newly created node-red-app folder, which is an independent NPM project. To run the Node-Red project, we need to cd to that folder, execute yarn to install the project dependencies, and finally execute yarn start."),(0,s.kt)("p",null,"Once running successfully, the service can be accessed through the address with port 1880."),(0,s.kt)("h3",{id:"static-resource-storage"},"Static Resource Storage"),(0,s.kt)("p",null,' we need to store static resources, we can create a static resource directory under the node-red-app folder with a self-chosen file name. Here, we use "public" as an example. At the same time, add the following code to the setting.js file under the node-red-app folder\uff1a'),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-jsx"},"httpStatic: path.join(__dirname, 'public'),\n httpAdminRoot: \"/admin\"\n\n")),(0,s.kt)("p",null,"example\uff1a"),(0,s.kt)("p",null,'To access the stored resources, the URL only needs to be accessed using "/". The URL for the Node-Red control page has been changed to:',(0,s.kt)("a",{parentName:"p",href:"http://127.0.0.1:1880/admin"},"http://127.0.0.1:1880/admin")),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(9979).Z,width:"1089",height:"530"})),(0,s.kt)("h3",{id:"initialization-configuration"},"Initialization Configuration"),(0,s.kt)("p",null,"After running the Node-Red service, we can access the Node-Red by entering the address displayed on the console in a browser. Upon the first access to the service, we will see an initialization configuration wizard interface, where we can set up the account and password for accessing the Node-Red service, etc. We only need to follow the prompts to complete the configuration."),(0,s.kt)("p",null,'After completing the initialization configuration, we will be automatically redirected to the homepage named "Node-RED on Steedos". On this page, we can see a tutorial on how to customize Node-Red.'),(0,s.kt)("h2",{id:"flow-designer"},"Flow Designer"),(0,s.kt)("p",null,'On the homepage of the running Node-Red service, we can see a button named "Go to your Node-RED flow editor" on the right side. Clicking on it will open an editor named "Flow Builder". We can access the official Node-Red website tutorial at \xa0',(0,s.kt)("a",{parentName:"p",href:"https://node-red.org/docs/user-guide/"},"https://Node-Red.org/docs/user-guide/"),"\xa0 to learn how to configure, debug, and deploy flows in the editor."),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(3359).Z,width:"1036",height:"627"})),(0,s.kt)("h2",{id:"steedos-node"},"Steedos Node"),(0,s.kt)("p",null,"We can use the aforementioned Flow Designer to configure the integration of existing business systems. If we need to connect mainstream business systems such as SAP, UFIDA, and Kingdee to integrate related businesses into Steedos, we can use a variety of nodes specially developed by us, which can easily realize various integration business requirements."),(0,s.kt)("h3",{id:"steedos-event"},"steedos-event"),(0,s.kt)("p",null,"Steedos Event refers to the function of event subscription and publication using the Steedos Event service in the Steedos platform. Through Steedos Event, we can subscribe to specific events, such as record creation, update or deletion events, in order to execute custom operations when the events occur. In Steedos Event, we need to specify the following parameters:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("inlineCode",{parentName:"li"},"Broker"),"\xa0\uff1aa parameter used in Node-RED to specify the message broker used. In Node-RED, we can connect to Steedos projects by configuring the broker. Usually, NATS is used as the message broker. To configure the broker, we need to make corresponding configurations in the .env file under the Node-RED-app folder and reference it in Node-RED. For more details about NATS as a message broker, please refer to the following link:",(0,s.kt)("a",{parentName:"li",href:"https://moleculer.services/zh/docs/0.14/networking.html#NATS-Transporter%E3%80%82"},"https://moleculer.services/zh/docs/0.14/networking.html#NATS-Transporter\u3002")),(0,s.kt)("li",{parentName:"ul"},"Service\uff1aspecifies the name of the service used."),(0,s.kt)("li",{parentName:"ul"},"Name\uff1aspecifies the name of the node, such as the name of the node subscribing to events."),(0,s.kt)("li",{parentName:"ul"},"Topic\uff1aspecifies the topic or event name to subscribe to, such as creating records or updating records."),(0,s.kt)("li",{parentName:"ul"},"Group\uff1aspecifies the group where events are subscribed, which can be one or more groups separated by commas.")),(0,s.kt)("p",null,"By configuring these parameters, we can use Steedos Event in the Steedos platform to implement the function of event subscription and publication, so as to execute custom operations when events occur. For example, we can subscribe to record creation events, and send notifications to Slack or WeChat when events occur, or execute custom JavaScript code when events occur to achieve more complex operations."),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(9725).Z,width:"506",height:"417"})),(0,s.kt)("h3",{id:"steedos-emit"},"steedos-emit"),(0,s.kt)("p",null,"Steedos Emit is a node within Node-RED, used for sending event messages to the Steedos project. This node requires the following parameters to be configured:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Broker: Specifies the name of the message broker being used;"),(0,s.kt)("li",{parentName:"ul"},"Name: Specifies the name of the node;"),(0,s.kt)("li",{parentName:"ul"},"Topic: Specifies the event topic/name, which can be overridden by msg.topic;"),(0,s.kt)("li",{parentName:"ul"},"Broadcast: Specifies whether the event should be broadcast, which can be overridden by msg.broadcast;"),(0,s.kt)("li",{parentName:"ul"},"Group: Specifies the group(s) to which the event belongs, with multiple group names separated by commas. This can be overridden by msg.group.")),(0,s.kt)("p",null,"By configuring these parameters, we can use the Steedos Emit node in Node-RED to send event messages to the Steedos project, enabling communication between different components."),(0,s.kt)("h3",{id:"steedos-call"},"steedos-call"),(0,s.kt)("p",null,"Steedos Call is a Node-RED node used for invoking the APIs provided by the Steedos platform. It can invoke the APIs of the Steedos platform by configuring Broker and Action. The value of Action can also be overridden by the msg.action property. Additionally, some JSON format options can be set in Options to better control the behavior of API invocation. For more information on the APIs provided by the Steedos platform, please refer to the API documentation of the Steedos platform. You can find more information about this in the steedos-template project."),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(2702).Z,width:"1408",height:"680"})),(0,s.kt)("h3",{id:"steedos-request"},"steedos-request"),(0,s.kt)("p",null,"Steedos Request is a Node-RED node used for sending HTTP requests to the ObjectQL microservices and GraphQL microservices of the Steedos platform. This node requires the following parameters to be configured:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Broker: Message broker."),(0,s.kt)("li",{parentName:"ul"},"Service: Name of the microservice to be called."),(0,s.kt)("li",{parentName:"ul"},"Name: The name of the node, used to identify the node within Node-RED."),(0,s.kt)("li",{parentName:"ul"},"Action: The name of the operation to be performed, such as querying, creating, updating, or deleting objects. If the msg.action property is included in the message, it will override this parameter."),(0,s.kt)("li",{parentName:"ul"},'REST: This attribute can customize the API according to JSON values. The "method" is the request method and the "path" is the routing URL address.'),(0,s.kt)("li",{parentName:"ul"},'Trigger\uff1aThis attribute can customize the trigger according to JSON values. The "listenTo" is the object being listened to, and the "when" is the triggering timing. Detailed values can be found in the trigger section of the official documentation of the Steedos platform:',(0,s.kt)("a",{parentName:"li",href:"https://beta.steedos.cn/docs/developer/action-trigger"},"https://beta.steedos.cn/docs/developer/action-trigger"))),(0,s.kt)("p",null,"When the node receives input messages, it sends the data in the messages as parameters for the request to the Steedos platform and sends the response data as output messages to the next node. You can find more information about this in the steedos-template project."),(0,s.kt)("p",null,"For example, you can customize an API in Node-RED with Steedos Request."),(0,s.kt)("p",null,"The API Endpoint:",(0,s.kt)("a",{parentName:"p",href:"http://127.0.0.1:5000/service/api/example-service/hello/jack"},"http://127.0.0.1:5000/service/api/example-service/"),"+path"),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(1422).Z,width:"516",height:"537"})," "),(0,s.kt)("p",null,"Example\uff1a"),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(4992).Z,width:"513",height:"502"})," "),(0,s.kt)("h3",{id:"steedos-response"},"steedos-response"),(0,s.kt)("p",null,"Steedos Response is a Node-RED node used for sending response messages to the initiator of an HTTP request. This node requires the following parameters to be configured:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Name: The name of the node, used to identify the node within Node-RED.")),(0,s.kt)("p",null,"When the node receives input messages, it sends the data in the messages back to the initiator of the HTTP request as the response body. The options of the node can be configured to set the status code, HTTP headers, and content type of the response. This node is typically used in conjunction with the Steedos Request node to respond to requests from the ObjectQL microservices and GraphQL microservices of the Steedos platform. More details can be found in the steedos-template project."),(0,s.kt)("h3",{id:"steedos-api-gw"},"steedos-api-gw"),(0,s.kt)("p",null,"Steedos API Gateway (APIGW) is an open-source API gateway in Steedos that helps enterprises integrate multiple microservices into a unified API. "),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},(0,s.kt)("inlineCode",{parentName:"p"},"Broker"),":refers to the message broker")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},(0,s.kt)("inlineCode",{parentName:"p"},"Name"),"\uff1aspecifies the name of the node")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},(0,s.kt)("inlineCode",{parentName:"p"},"Action"),": is the name of the operation to be performed"))),(0,s.kt)("p",null,"It provides a range of functionalities, such as API management, security authentication, traffic control, logging, and monitoring. In Steedos, APIGW is an independent service that can be configured through configuration files and used in conjunction with other services. This node requires the following parameters. More details can be found in the steedos-template project."),(0,s.kt)("h3",{id:"steedos-instance"},"steedos-instance"),(0,s.kt)("p",null,"Steedos Instance is a Node-RED node that allows you to inject a Steedos instance into the flow or global context. It enables you to perform various operations using the API of the Steedos platform, such as querying, creating, updating, and deleting data. "),(0,s.kt)("p",null,"Before using the Steedos Instance node, you need to create an application on the Steedos platform and configure its data model. Then, you need to specify the name of the application and the access token in the configuration of the Steedos Instance node. This way, when you call the Steedos instance in the flow or global context, it will automatically authenticate you with the credentials you provide and allow you to perform application-related operations. More details can be found in the steedos-template project."),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(7006).Z,width:"492",height:"373"})," "),(0,s.kt)("h2",{id:"to-invoke-graphql"},"To invoke GraphQL"),(0,s.kt)("p",null,"use msg.call in your Node-RED flow."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-jsx"},'msg.call(\'api.graphql\', \n {\n query: `query {\n space_users(filters: ["user", "=", "${msg.meta.user.userId}"]) {\n name\n organization\n }\n }`\n }, \n { meta: { } }\n).then((data) => {\n msg.payload = data\n node.send(msg)\n}).catch((err) => {\n node.error(err, msg)\n}) \n')),(0,s.kt)("h2",{id:"to-invoke-objectql"},"To invoke ObjectQL"),(0,s.kt)("p",null,"There are two ways to invoke ObjectQL in Node-RED:"),(0,s.kt)("h3",{id:"invoke-using-msgcall"},"Invoke using msg.call"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-jsx"},'msg.call(\'objectql.find\',\n {\n "objectName": "space_users",\n "query": {\n // "fields": ["name", "orgranizations"],\n "filters": ["user", "=", msg.meta.user.userId]\n }\n },\n { meta: {} }\n).then((data) => {\n msg.payload = data\n node.send(msg)\n}).catch((err) => {\n node.error(err, msg)\n})\n')),(0,s.kt)("h3",{id:"invoke-using-a-broker"},"Invoke using a broker"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre"},'const broker = global.get(\'broker\');\n\nmsg.payload = await broker.call(\'objectql.find\', \n {\n "objectName": "space_users",\n "query": {\n "fields": ["name", "organizations"]\n }\n },\n { meta: {} }\n)\n')),(0,s.kt)("h2",{id:"trigger"},"Trigger"),(0,s.kt)("p",null,"Example\uff1a"),(0,s.kt)("p",null," ",(0,s.kt)("img",{src:n(3476).Z,width:"1080",height:"370"})," "),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-json"},'[\n{\n"id": "7350d7b42b233ab6",\n"type": "steedos-request-action",\n"z": "c10017b236a162fd",\n"broker": "ce147b46c731d342",\n"service": "5ab5acead56ffaea",\n"name": "trigger",\n"topic": "space_users_triggers",\n"rest": "{}",\n"restType": "json",\n"trigger": "{\\"listenTo\\":\\"space_users\\",\\"when\\":[\\"beforeInsert\\",\\"beforeUpdate\\"]}",\n"triggerType": "json",\n"params": "{}",\n"paramsType": "json",\n"x": 100,\n"y": 120,\n"wires": [\n[\n"0441d3a1237dcd50",\n"6f988203ee0b8323"\n]\n]\n},\n{\n"id": "0441d3a1237dcd50",\n"type": "function",\n"z": "c10017b236a162fd",\n"name": "trigger",\n"func": "const doc = msg.payload.doc;\\nif ([doc.name](http://doc.name/) && doc.name.length < 2) {\\n msg.error = { message: \\"\u59d3\u540d\u6700\u5c11\u4e24\u4f4d.\\" };\\n}\\n\\nreturn msg;",\n"outputs": 1,\n"noerr": 0,\n"initialize": "",\n"finalize": "",\n"libs": [],\n"x": 350,\n"y": 160,\n"wires": [\n[\n"dd4a70227645def5",\n"1a4631e22fdbdc5d"\n]\n]\n},\n{\n"id": "dd4a70227645def5",\n"type": "debug",\n"z": "c10017b236a162fd",\n"name": "debug 5",\n"active": true,\n"tosidebar": true,\n"console": false,\n"tostatus": false,\n"complete": "error",\n"targetType": "msg",\n"statusVal": "",\n"statusType": "auto",\n"x": 680,\n"y": 80,\n"wires": []\n},\n{\n"id": "1a4631e22fdbdc5d",\n"type": "steedos-response-action",\n"z": "c10017b236a162fd",\n"name": "",\n"x": 700,\n"y": 220,\n"wires": []\n},\n{\n"id": "6f988203ee0b8323",\n"type": "debug",\n"z": "c10017b236a162fd",\n"name": "debug 6",\n"active": true,\n"tosidebar": true,\n"console": false,\n"tostatus": false,\n"complete": "payload",\n"targetType": "msg",\n"statusVal": "",\n"statusType": "auto",\n"x": 340,\n"y": 60,\n"wires": []\n},\n{\n"id": "ce147b46c731d342",\n"type": "steedos-config",\n"name": "steedos",\n"transporter": "${TRANSPORTER}",\n"namespace": "steedos",\n"options": "{}",\n"optionsType": "json"\n},\n{\n"id": "5ab5acead56ffaea",\n"type": "steedos-service-config",\n"name": "example-nodered",\n"version": "",\n"settings": "{}",\n"rest": "",\n"settingsType": "json"\n}\n]\n')))}u.isMDXComponent=!0},2702:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_emit-29955bd9294885f17cf2eed304685935.png"},9725:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_event-78ce44ace55234ec2581600a0c05f267.png"},7006:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_gw-e2e27700758235cdbfd1a6d5c0588bc3.png"},3359:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_ini-bfe9945e10eab38eda565602e9ec69bb.png"},3476:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_objectql-926400805a4e3413352d086203e3276b.png"},1422:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_request-200f73b055c328df7566ad09c70e70dd.png"},4992:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_request_ex-b4b5f1d2b81008d3e8d0b640b70f4d27.png"},9979:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_run-9a6935e2c40d4f371de149c2a1bd4226.png"}}]); \ No newline at end of file diff --git a/assets/js/8519c91b.38dde620.js b/assets/js/8519c91b.38dde620.js new file mode 100644 index 0000000000..06b3d098d8 --- /dev/null +++ b/assets/js/8519c91b.38dde620.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5178],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function c(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var i=n.createContext({}),l=function(e){var t=n.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):c(c({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(i.Provider,{value:t},e.children)},d="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,i=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=l(r),m=a,f=d["".concat(i,".").concat(m)]||d[m]||p[m]||o;return r?n.createElement(f,c(c({ref:t},u),{},{components:r})):n.createElement(f,c({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,c=new Array(o);c[0]=m;var s={};for(var i in t)hasOwnProperty.call(t,i)&&(s[i]=t[i]);s.originalType=e,s[d]="string"==typeof e?e:a,c[1]=s;for(var l=2;l{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var n=r(7462),a=(r(7294),r(3905));const o={},c="External Data Sources",s={unversionedId:"no-code/customize/external-datasources",id:"no-code/customize/external-datasources",title:"External Data Sources",description:"An external data source specifies how to access an external system. External data sources have associated external objects, which your users and the Steedos platform use to interact with the external data and content.",source:"@site/docs/no-code/customize/external-datasources.md",sourceDirName:"no-code/customize",slug:"/no-code/customize/external-datasources",permalink:"/no-code/customize/external-datasources",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/no-code/customize/external-datasources.md",tags:[],version:"current",frontMatter:{},sidebar:"platform",previous:{title:"Custom Button",permalink:"/no-code/customize/button"},next:{title:"List Views",permalink:"/no-code/customize/listview"}},i={},l=[{value:"Validate and Sync an External Data Source",id:"validate-and-sync-an-external-data-source",level:2}],u={toc:l},d="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(d,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"external-data-sources"},"External Data Sources"),(0,a.kt)("p",null,"An external data source specifies how to access an external system. External data sources have associated external objects, which your users and the Steedos platform use to interact with the external data and content."),(0,a.kt)("h2",{id:"validate-and-sync-an-external-data-source"},"Validate and Sync an External Data Source"),(0,a.kt)("p",null,"After you configure an external data source, synchronize it to map its tables with external objects in your Steedos org. The content and data of external objects appear in federated search, together with your Steedos content and data."),(0,a.kt)("admonition",{type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Available on: Enterprise Edition")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/871431f6.2c7c51ed.js b/assets/js/871431f6.2c7c51ed.js new file mode 100644 index 0000000000..76537c11c5 --- /dev/null +++ b/assets/js/871431f6.2c7c51ed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[708],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>g});var o=n(7294);function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(s[n]=e[n]);return s}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s}var d=o.createContext({}),l=function(e){var t=o.useContext(d),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},c=function(e){var t=l(e.components);return o.createElement(d.Provider,{value:t},e.children)},p="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},h=o.forwardRef((function(e,t){var n=e.components,s=e.mdxType,a=e.originalType,d=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=l(n),h=s,g=p["".concat(d,".").concat(h)]||p[h]||u[h]||a;return n?o.createElement(g,r(r({ref:t},c),{},{components:n})):o.createElement(g,r({ref:t},c))}));function g(e,t){var n=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var a=n.length,r=new Array(a);r[0]=h;var i={};for(var d in t)hasOwnProperty.call(t,d)&&(i[d]=t[d]);i.originalType=e,i[p]="string"==typeof e?e:s,r[1]=i;for(var l=2;l{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>a,metadata:()=>i,toc:()=>l});var o=n(7462),s=(n(7294),n(3905));const a={title:"Node-Red"},r=void 0,i={unversionedId:"developer/integration/node-red",id:"developer/integration/node-red",title:"Node-Red",description:"Node-RED is a process-oriented programming tool that allows you to effortlessly connect IoT devices, APIs and online services together. It employs a browser-based editor which allows users to drag and drop different nodes onto a canvas, and connect them to create a flow. Node-RED also offers a plethora of nodes which enable users to easily interact with a diverse range of devices and services.https://Node-Red.org/\u3002",source:"@site/docs/developer/integration/node-red.mdx",sourceDirName:"developer/integration",slug:"/developer/integration/node-red",permalink:"/developer/integration/node-red",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/developer/integration/node-red.mdx",tags:[],version:"current",frontMatter:{title:"Node-Red"},sidebar:"developer",previous:{title:"SSO API",permalink:"/developer/integration/api-jwt-sso"}},d={},l=[{value:"Integrating a Node-RED project",id:"integrating-a-node-red-project",level:2},{value:"Developing an application",id:"developing-an-application",level:3},{value:"Executing",id:"executing",level:3},{value:"Static Resource Storage",id:"static-resource-storage",level:3},{value:"Initialization Configuration",id:"initialization-configuration",level:3},{value:"Flow Designer",id:"flow-designer",level:2},{value:"Steedos Node",id:"steedos-node",level:2},{value:"steedos-event",id:"steedos-event",level:3},{value:"steedos-emit",id:"steedos-emit",level:3},{value:"steedos-call",id:"steedos-call",level:3},{value:"steedos-request",id:"steedos-request",level:3},{value:"steedos-response",id:"steedos-response",level:3},{value:"steedos-api-gw",id:"steedos-api-gw",level:3},{value:"steedos-instance",id:"steedos-instance",level:3},{value:"To invoke GraphQL",id:"to-invoke-graphql",level:2},{value:"To invoke ObjectQL",id:"to-invoke-objectql",level:2},{value:"Invoke using msg.call",id:"invoke-using-msgcall",level:3},{value:"Invoke using a broker",id:"invoke-using-a-broker",level:3},{value:"Trigger",id:"trigger",level:2}],c={toc:l},p="wrapper";function u(e){let{components:t,...a}=e;return(0,s.kt)(p,(0,o.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"Node-RED is a process-oriented programming tool that allows you to effortlessly connect IoT devices, APIs and online services together. It employs a browser-based editor which allows users to drag and drop different nodes onto a canvas, and connect them to create a flow. Node-RED also offers a plethora of nodes which enable users to easily interact with a diverse range of devices and services.",(0,s.kt)("a",{parentName:"p",href:"https://node-red.org/"},"https://Node-Red.org/"),"\u3002"),(0,s.kt)("h2",{id:"integrating-a-node-red-project"},"Integrating a Node-RED project"),(0,s.kt)("h3",{id:"developing-an-application"},"Developing an application"),(0,s.kt)("p",null,"Reference to\uff1a",(0,s.kt)("a",{parentName:"p",href:"https://gitlab.steedos.cn/steedos/steedos-project-template.git"},"steedos-project-template.git")),(0,s.kt)("h3",{id:"executing"},"Executing"),(0,s.kt)("p",null,"We can see the package.json file in the newly created node-red-app folder, which is an independent NPM project. To run the Node-Red project, we need to cd to that folder, execute yarn to install the project dependencies, and finally execute yarn start."),(0,s.kt)("p",null,"Once running successfully, the service can be accessed through the address with port 1880."),(0,s.kt)("h3",{id:"static-resource-storage"},"Static Resource Storage"),(0,s.kt)("p",null,' we need to store static resources, we can create a static resource directory under the node-red-app folder with a self-chosen file name. Here, we use "public" as an example. At the same time, add the following code to the setting.js file under the node-red-app folder\uff1a'),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-jsx"},"httpStatic: path.join(__dirname, 'public'),\n httpAdminRoot: \"/admin\"\n\n")),(0,s.kt)("p",null,"example\uff1a"),(0,s.kt)("p",null,'To access the stored resources, the URL only needs to be accessed using "/". The URL for the Node-Red control page has been changed to:',(0,s.kt)("a",{parentName:"p",href:"http://127.0.0.1:1880/admin"},"http://127.0.0.1:1880/admin")),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(9979).Z,width:"1089",height:"530"})),(0,s.kt)("h3",{id:"initialization-configuration"},"Initialization Configuration"),(0,s.kt)("p",null,"After running the Node-Red service, we can access the Node-Red by entering the address displayed on the console in a browser. Upon the first access to the service, we will see an initialization configuration wizard interface, where we can set up the account and password for accessing the Node-Red service, etc. We only need to follow the prompts to complete the configuration."),(0,s.kt)("p",null,'After completing the initialization configuration, we will be automatically redirected to the homepage named "Node-RED on Steedos". On this page, we can see a tutorial on how to customize Node-Red.'),(0,s.kt)("h2",{id:"flow-designer"},"Flow Designer"),(0,s.kt)("p",null,'On the homepage of the running Node-Red service, we can see a button named "Go to your Node-RED flow editor" on the right side. Clicking on it will open an editor named "Flow Builder". We can access the official Node-Red website tutorial at \xa0',(0,s.kt)("a",{parentName:"p",href:"https://node-red.org/docs/user-guide/"},"https://Node-Red.org/docs/user-guide/"),"\xa0 to learn how to configure, debug, and deploy flows in the editor."),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(3359).Z,width:"1036",height:"627"})),(0,s.kt)("h2",{id:"steedos-node"},"Steedos Node"),(0,s.kt)("p",null,"We can use the aforementioned Flow Designer to configure the integration of existing business systems. If we need to connect mainstream business systems such as SAP, UFIDA, and Kingdee to integrate related businesses into Steedos, we can use a variety of nodes specially developed by us, which can easily realize various integration business requirements."),(0,s.kt)("h3",{id:"steedos-event"},"steedos-event"),(0,s.kt)("p",null,"Steedos Event refers to the function of event subscription and publication using the Steedos Event service in the Steedos platform. Through Steedos Event, we can subscribe to specific events, such as record creation, update or deletion events, in order to execute custom operations when the events occur. In Steedos Event, we need to specify the following parameters:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("inlineCode",{parentName:"li"},"Broker"),"\xa0\uff1aa parameter used in Node-RED to specify the message broker used. In Node-RED, we can connect to Steedos projects by configuring the broker. Usually, NATS is used as the message broker. To configure the broker, we need to make corresponding configurations in the .env file under the Node-RED-app folder and reference it in Node-RED. For more details about NATS as a message broker, please refer to the following link:",(0,s.kt)("a",{parentName:"li",href:"https://moleculer.services/zh/docs/0.14/networking.html#NATS-Transporter%E3%80%82"},"https://moleculer.services/zh/docs/0.14/networking.html#NATS-Transporter\u3002")),(0,s.kt)("li",{parentName:"ul"},"Service\uff1aspecifies the name of the service used."),(0,s.kt)("li",{parentName:"ul"},"Name\uff1aspecifies the name of the node, such as the name of the node subscribing to events."),(0,s.kt)("li",{parentName:"ul"},"Topic\uff1aspecifies the topic or event name to subscribe to, such as creating records or updating records."),(0,s.kt)("li",{parentName:"ul"},"Group\uff1aspecifies the group where events are subscribed, which can be one or more groups separated by commas.")),(0,s.kt)("p",null,"By configuring these parameters, we can use Steedos Event in the Steedos platform to implement the function of event subscription and publication, so as to execute custom operations when events occur. For example, we can subscribe to record creation events, and send notifications to Slack or WeChat when events occur, or execute custom JavaScript code when events occur to achieve more complex operations."),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(9725).Z,width:"506",height:"417"})),(0,s.kt)("h3",{id:"steedos-emit"},"steedos-emit"),(0,s.kt)("p",null,"Steedos Emit is a node within Node-RED, used for sending event messages to the Steedos project. This node requires the following parameters to be configured:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Broker: Specifies the name of the message broker being used;"),(0,s.kt)("li",{parentName:"ul"},"Name: Specifies the name of the node;"),(0,s.kt)("li",{parentName:"ul"},"Topic: Specifies the event topic/name, which can be overridden by msg.topic;"),(0,s.kt)("li",{parentName:"ul"},"Broadcast: Specifies whether the event should be broadcast, which can be overridden by msg.broadcast;"),(0,s.kt)("li",{parentName:"ul"},"Group: Specifies the group(s) to which the event belongs, with multiple group names separated by commas. This can be overridden by msg.group.")),(0,s.kt)("p",null,"By configuring these parameters, we can use the Steedos Emit node in Node-RED to send event messages to the Steedos project, enabling communication between different components."),(0,s.kt)("h3",{id:"steedos-call"},"steedos-call"),(0,s.kt)("p",null,"Steedos Call is a Node-RED node used for invoking the APIs provided by the Steedos platform. It can invoke the APIs of the Steedos platform by configuring Broker and Action. The value of Action can also be overridden by the msg.action property. Additionally, some JSON format options can be set in Options to better control the behavior of API invocation. For more information on the APIs provided by the Steedos platform, please refer to the API documentation of the Steedos platform. You can find more information about this in the steedos-template project."),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(2702).Z,width:"1408",height:"680"})),(0,s.kt)("h3",{id:"steedos-request"},"steedos-request"),(0,s.kt)("p",null,"Steedos Request is a Node-RED node used for sending HTTP requests to the ObjectQL microservices and GraphQL microservices of the Steedos platform. This node requires the following parameters to be configured:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Broker: Message broker."),(0,s.kt)("li",{parentName:"ul"},"Service: Name of the microservice to be called."),(0,s.kt)("li",{parentName:"ul"},"Name: The name of the node, used to identify the node within Node-RED."),(0,s.kt)("li",{parentName:"ul"},"Action: The name of the operation to be performed, such as querying, creating, updating, or deleting objects. If the msg.action property is included in the message, it will override this parameter."),(0,s.kt)("li",{parentName:"ul"},'REST: This attribute can customize the API according to JSON values. The "method" is the request method and the "path" is the routing URL address.'),(0,s.kt)("li",{parentName:"ul"},'Trigger\uff1aThis attribute can customize the trigger according to JSON values. The "listenTo" is the object being listened to, and the "when" is the triggering timing. Detailed values can be found in the trigger section of the official documentation of the Steedos platform:',(0,s.kt)("a",{parentName:"li",href:"https://beta.steedos.cn/docs/developer/action-trigger"},"https://beta.steedos.cn/docs/developer/action-trigger"))),(0,s.kt)("p",null,"When the node receives input messages, it sends the data in the messages as parameters for the request to the Steedos platform and sends the response data as output messages to the next node. You can find more information about this in the steedos-template project."),(0,s.kt)("p",null,"For example, you can customize an API in Node-RED with Steedos Request."),(0,s.kt)("p",null,"The API Endpoint:",(0,s.kt)("a",{parentName:"p",href:"http://127.0.0.1:5000/service/api/example-service/hello/jack"},"http://127.0.0.1:5000/service/api/example-service/"),"+path"),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(1422).Z,width:"516",height:"537"})," "),(0,s.kt)("p",null,"Example\uff1a"),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(4992).Z,width:"513",height:"502"})," "),(0,s.kt)("h3",{id:"steedos-response"},"steedos-response"),(0,s.kt)("p",null,"Steedos Response is a Node-RED node used for sending response messages to the initiator of an HTTP request. This node requires the following parameters to be configured:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Name: The name of the node, used to identify the node within Node-RED.")),(0,s.kt)("p",null,"When the node receives input messages, it sends the data in the messages back to the initiator of the HTTP request as the response body. The options of the node can be configured to set the status code, HTTP headers, and content type of the response. This node is typically used in conjunction with the Steedos Request node to respond to requests from the ObjectQL microservices and GraphQL microservices of the Steedos platform. More details can be found in the steedos-template project."),(0,s.kt)("h3",{id:"steedos-api-gw"},"steedos-api-gw"),(0,s.kt)("p",null,"Steedos API Gateway (APIGW) is an open-source API gateway in Steedos that helps enterprises integrate multiple microservices into a unified API. "),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},(0,s.kt)("inlineCode",{parentName:"p"},"Broker"),":refers to the message broker")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},(0,s.kt)("inlineCode",{parentName:"p"},"Name"),"\uff1aspecifies the name of the node")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},(0,s.kt)("inlineCode",{parentName:"p"},"Action"),": is the name of the operation to be performed"))),(0,s.kt)("p",null,"It provides a range of functionalities, such as API management, security authentication, traffic control, logging, and monitoring. In Steedos, APIGW is an independent service that can be configured through configuration files and used in conjunction with other services. This node requires the following parameters. More details can be found in the steedos-template project."),(0,s.kt)("h3",{id:"steedos-instance"},"steedos-instance"),(0,s.kt)("p",null,"Steedos Instance is a Node-RED node that allows you to inject a Steedos instance into the flow or global context. It enables you to perform various operations using the API of the Steedos platform, such as querying, creating, updating, and deleting data. "),(0,s.kt)("p",null,"Before using the Steedos Instance node, you need to create an application on the Steedos platform and configure its data model. Then, you need to specify the name of the application and the access token in the configuration of the Steedos Instance node. This way, when you call the Steedos instance in the flow or global context, it will automatically authenticate you with the credentials you provide and allow you to perform application-related operations. More details can be found in the steedos-template project."),(0,s.kt)("p",null,(0,s.kt)("img",{src:n(7006).Z,width:"492",height:"373"})," "),(0,s.kt)("h2",{id:"to-invoke-graphql"},"To invoke GraphQL"),(0,s.kt)("p",null,"use msg.call in your Node-RED flow."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-jsx"},'msg.call(\'api.graphql\', \n {\n query: `query {\n space_users(filters: ["user", "=", "${msg.meta.user.userId}"]) {\n name\n organization\n }\n }`\n }, \n { meta: { } }\n).then((data) => {\n msg.payload = data\n node.send(msg)\n}).catch((err) => {\n node.error(err, msg)\n}) \n')),(0,s.kt)("h2",{id:"to-invoke-objectql"},"To invoke ObjectQL"),(0,s.kt)("p",null,"There are two ways to invoke ObjectQL in Node-RED:"),(0,s.kt)("h3",{id:"invoke-using-msgcall"},"Invoke using msg.call"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-jsx"},'msg.call(\'objectql.find\',\n {\n "objectName": "space_users",\n "query": {\n // "fields": ["name", "orgranizations"],\n "filters": ["user", "=", msg.meta.user.userId]\n }\n },\n { meta: {} }\n).then((data) => {\n msg.payload = data\n node.send(msg)\n}).catch((err) => {\n node.error(err, msg)\n})\n')),(0,s.kt)("h3",{id:"invoke-using-a-broker"},"Invoke using a broker"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre"},'const broker = global.get(\'broker\');\n\nmsg.payload = await broker.call(\'objectql.find\', \n {\n "objectName": "space_users",\n "query": {\n "fields": ["name", "organizations"]\n }\n },\n { meta: {} }\n)\n')),(0,s.kt)("h2",{id:"trigger"},"Trigger"),(0,s.kt)("p",null,"Example\uff1a"),(0,s.kt)("p",null," ",(0,s.kt)("img",{src:n(3476).Z,width:"1080",height:"370"})," "),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-json"},'[\n{\n"id": "7350d7b42b233ab6",\n"type": "steedos-request-action",\n"z": "c10017b236a162fd",\n"broker": "ce147b46c731d342",\n"service": "5ab5acead56ffaea",\n"name": "trigger",\n"topic": "space_users_triggers",\n"rest": "{}",\n"restType": "json",\n"trigger": "{\\"listenTo\\":\\"space_users\\",\\"when\\":[\\"beforeInsert\\",\\"beforeUpdate\\"]}",\n"triggerType": "json",\n"params": "{}",\n"paramsType": "json",\n"x": 100,\n"y": 120,\n"wires": [\n[\n"0441d3a1237dcd50",\n"6f988203ee0b8323"\n]\n]\n},\n{\n"id": "0441d3a1237dcd50",\n"type": "function",\n"z": "c10017b236a162fd",\n"name": "trigger",\n"func": "const doc = msg.payload.doc;\\nif ([doc.name](http://doc.name/) && doc.name.length < 2) {\\n msg.error = { message: \\"\u59d3\u540d\u6700\u5c11\u4e24\u4f4d.\\" };\\n}\\n\\nreturn msg;",\n"outputs": 1,\n"noerr": 0,\n"initialize": "",\n"finalize": "",\n"libs": [],\n"x": 350,\n"y": 160,\n"wires": [\n[\n"dd4a70227645def5",\n"1a4631e22fdbdc5d"\n]\n]\n},\n{\n"id": "dd4a70227645def5",\n"type": "debug",\n"z": "c10017b236a162fd",\n"name": "debug 5",\n"active": true,\n"tosidebar": true,\n"console": false,\n"tostatus": false,\n"complete": "error",\n"targetType": "msg",\n"statusVal": "",\n"statusType": "auto",\n"x": 680,\n"y": 80,\n"wires": []\n},\n{\n"id": "1a4631e22fdbdc5d",\n"type": "steedos-response-action",\n"z": "c10017b236a162fd",\n"name": "",\n"x": 700,\n"y": 220,\n"wires": []\n},\n{\n"id": "6f988203ee0b8323",\n"type": "debug",\n"z": "c10017b236a162fd",\n"name": "debug 6",\n"active": true,\n"tosidebar": true,\n"console": false,\n"tostatus": false,\n"complete": "payload",\n"targetType": "msg",\n"statusVal": "",\n"statusType": "auto",\n"x": 340,\n"y": 60,\n"wires": []\n},\n{\n"id": "ce147b46c731d342",\n"type": "steedos-config",\n"name": "steedos",\n"transporter": "${TRANSPORTER}",\n"namespace": "steedos",\n"options": "{}",\n"optionsType": "json"\n},\n{\n"id": "5ab5acead56ffaea",\n"type": "steedos-service-config",\n"name": "example-nodered",\n"version": "",\n"settings": "{}",\n"rest": "",\n"settingsType": "json"\n}\n]\n')))}u.isMDXComponent=!0},2702:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_emit-29955bd9294885f17cf2eed304685935.png"},9725:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_event-78ce44ace55234ec2581600a0c05f267.png"},7006:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_gw-e2e27700758235cdbfd1a6d5c0588bc3.png"},3359:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_ini-bfe9945e10eab38eda565602e9ec69bb.png"},3476:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_objectql-926400805a4e3413352d086203e3276b.png"},1422:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_request-200f73b055c328df7566ad09c70e70dd.png"},4992:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_request_ex-b4b5f1d2b81008d3e8d0b640b70f4d27.png"},9979:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/node_red_run-9a6935e2c40d4f371de149c2a1bd4226.png"}}]); \ No newline at end of file diff --git a/assets/js/8ef82481.655c7874.js b/assets/js/8ef82481.655c7874.js deleted file mode 100644 index 61f26662d9..0000000000 --- a/assets/js/8ef82481.655c7874.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[442],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),l=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),d=l(r),p=a,f=d["".concat(s,".").concat(p)]||d[p]||m[p]||o;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=p;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[d]="string"==typeof e?e:a,i[1]=c;for(var l=2;l{r.d(t,{Z:()=>h});var n=r(7294),a=r(6010),o=r(3438),i=r(9960),c=r(3919),s=r(5999);const l={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function u(e){let{href:t,children:r}=e;return n.createElement(i.Z,{href:t,className:(0,a.Z)("card padding--lg",l.cardContainer)},r)}function d(e){let{href:t,icon:r,title:o,description:i}=e;return n.createElement(u,{href:t},n.createElement("h2",{className:(0,a.Z)("text--truncate",l.cardTitle),title:o},r," ",o),i&&n.createElement("p",{className:(0,a.Z)("text--truncate",l.cardDescription),title:i},i))}function m(e){let{item:t}=e;const r=(0,o.Wl)(t);return r?n.createElement(d,{href:r,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,s.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function p(e){let{item:t}=e;const r=(0,c.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",a=(0,o.xz)(t.docId??void 0);return n.createElement(d,{href:t.href,icon:r,title:t.label,description:t.description??a?.description})}function f(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(p,{item:t});case"category":return n.createElement(m,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function y(e){let{className:t}=e;const r=(0,o.jA)();return n.createElement(h,{items:r.items,className:t})}function h(e){const{items:t,className:r}=e;if(!t)return n.createElement(y,e);const i=(0,o.MN)(t);return n.createElement("section",{className:(0,a.Z)("row",r)},i.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(f,{item:e})))))}},8489:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var n=r(7462),a=(r(7294),r(3905)),o=r(2991);const i={},c="Extend the Reach of Your Organization",s={unversionedId:"integration",id:"integration",title:"Extend the Reach of Your Organization",description:"Sometimes your users need to work with data and services that are outside your Steedos org. There\u2019s a variety of ways you can provide seamless access across org boundaries.",source:"@site/docs/integration.md",sourceDirName:".",slug:"/integration",permalink:"/integration",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/integration.md",tags:[],version:"current",frontMatter:{},sidebar:"platform",previous:{title:"Trigger managed permissions",permalink:"/admin/permissions/before-find"},next:{title:"External Data Sources",permalink:"/integration/external-datasources"}},l={},u=[{value:"Work with External Data Sources",id:"work-with-external-data-sources",level:2}],d={toc:u},m="wrapper";function p(e){let{components:t,...r}=e;return(0,a.kt)(m,(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"extend-the-reach-of-your-organization"},"Extend the Reach of Your Organization"),(0,a.kt)("p",null,"Sometimes your users need to work with data and services that are outside your Steedos org. There\u2019s a variety of ways you can provide seamless access across org boundaries."),(0,a.kt)("h2",{id:"work-with-external-data-sources"},"Work with External Data Sources"),(0,a.kt)("p",null,"An external data source specifies how to access an external system. Steedos Connect uses external data sources to access data that's stored outside your Steedos organization. External data sources have associated external objects, which your users and the platform use to interact with the external data and content."),(0,a.kt)(o.Z,{mdxType:"DocCardList"}))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.c03e475f.js b/assets/js/935f2afb.c03e475f.js deleted file mode 100644 index a18f0ef9fd..0000000000 --- a/assets/js/935f2afb.c03e475f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"platform":[{"type":"category","label":"Getting Started","collapsed":false,"items":[{"type":"link","label":"What is Steedos?","href":"/getting-started/","docId":"getting-started/README"},{"type":"category","label":"Tutorials","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"The Basics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Lesson 1: Creating Objects","href":"/getting-started/tutorials/the-basics/object","docId":"getting-started/tutorials/the-basics/object"},{"type":"link","label":"Lesson 2: Defining Relationships","href":"/getting-started/tutorials/the-basics/relationship","docId":"getting-started/tutorials/the-basics/relationship"},{"type":"link","label":"Lesson 3: Creating Application","href":"/getting-started/tutorials/the-basics/app","docId":"getting-started/tutorials/the-basics/app"},{"type":"link","label":"Lesson 4: Workflow Rules","href":"/getting-started/tutorials/the-basics/workflow-rules","docId":"getting-started/tutorials/the-basics/workflow-rules"}],"href":"/getting-started/tutorials/the-basics/"}],"href":"/getting-started/tutorials/"},{"type":"category","label":"User Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Steedos Interface","href":"/getting-started/user/overview","docId":"getting-started/user/overview"},{"type":"link","label":"Download Apps","href":"/getting-started/user/download-apps","docId":"getting-started/user/download-apps"}],"href":"/getting-started/user/"},{"type":"category","collapsed":true,"label":"Self Hosting","items":[{"type":"link","label":"Docker","href":"/deploy/deploy-docker","docId":"deploy/deploy-docker"},{"type":"link","label":"Intranet","href":"/deploy/intranet","docId":"deploy/intranet"},{"type":"link","label":"Try with Gitpod","href":"/deploy/gitpod","docId":"deploy/gitpod"},{"type":"link","label":"Instance Configuration","href":"/deploy/steedos-config","docId":"deploy/steedos-config"}],"collapsible":true,"href":"/deploy"}],"collapsible":true},{"type":"category","label":"Building Applications","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Application Overview","href":"/no-code/application/overview","docId":"no-code/application/overview"},{"type":"link","label":"Creating Your First Application","href":"/no-code/application/app","docId":"no-code/application/app"},{"type":"link","label":"Micro Page Builder","href":"/no-code/application/pages","docId":"no-code/application/pages"},{"type":"link","label":"Tabs","href":"/no-code/application/tab","docId":"no-code/application/tab"}],"href":"/no-code/application/"},{"type":"category","label":"Data Model and Management","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Custom Objects","href":"/no-code/customize/object","docId":"no-code/customize/object"},{"type":"category","label":"Field Types","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Field Attributes","href":"/no-code/customize/fields/field-attributes","docId":"no-code/customize/fields/field-attributes"},{"type":"link","label":"Basic Field Types","href":"/no-code/customize/fields/field-types","docId":"no-code/customize/fields/field-types"},{"type":"link","label":"Auto Number Field","href":"/no-code/customize/fields/field-type-autonumber","docId":"no-code/customize/fields/field-type-autonumber"},{"type":"link","label":"Roll-Up Summary Field","href":"/no-code/customize/fields/field-type-summary","docId":"no-code/customize/fields/field-type-summary"},{"type":"link","label":"Object Relationship Fields","href":"/no-code/customize/fields/relationship","docId":"no-code/customize/fields/relationship"}],"href":"/no-code/customize/fields/"},{"type":"category","label":"Calculate Field Values with Formulas","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Formula Overview","href":"/no-code/customize/formula/overview","docId":"no-code/customize/formula/overview"},{"type":"link","label":"Formula Field Types","href":"/no-code/customize/formula/formula-field","docId":"no-code/customize/formula/formula-field"},{"type":"link","label":"Formula Functions","href":"/no-code/customize/formula/functions","docId":"no-code/customize/formula/functions"},{"type":"link","label":"Cross-Object Formula","href":"/no-code/customize/formula/cross-object","docId":"no-code/customize/formula/cross-object"},{"type":"link","label":"Using Date/Time Values","href":"/no-code/customize/formula/datetime","docId":"no-code/customize/formula/datetime"}],"href":"/no-code/customize/formula/"},{"type":"link","label":"Object Relationships","href":"/no-code/customize/object-relationship","docId":"no-code/customize/object-relationship"},{"type":"link","label":"Custom Button","href":"/no-code/customize/button","docId":"no-code/customize/button"},{"type":"link","label":"List Views","href":"/no-code/customize/listview","docId":"no-code/customize/listview"},{"type":"link","label":"Page Layouts","href":"/no-code/customize/page-layout","docId":"no-code/customize/page-layout"},{"type":"link","label":"Validation Rules","href":"/no-code/customize/validation-rules","docId":"no-code/customize/validation-rules"}],"href":"/no-code/customize/"},{"type":"category","collapsed":false,"label":"Automate Your Processes","items":[{"type":"link","label":"Automated Actions","href":"/automation/automated-actions","docId":"automation/automated-actions"},{"type":"link","label":"Workflow Rules","href":"/automation/workflow-rules","docId":"automation/workflow-rules"},{"type":"link","label":"Approval Processes","href":"/automation/approval-process","docId":"automation/approval-process"},{"type":"category","label":"Approval King","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Admin Guide","href":"/automation/approval-king/admin-guide","docId":"automation/approval-king/admin-guide"},{"type":"link","label":"Users Started","href":"/automation/approval-king/getting-started","docId":"automation/approval-king/getting-started"}],"href":"/automation/approval-king/"}],"collapsible":true,"href":"/automation"},{"type":"category","label":"Setup Your Organization","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Company Info","href":"/admin/organization/company-info","docId":"admin/organization/company-info"},{"type":"link","label":"Manage Users","href":"/admin/organization/users","docId":"admin/organization/users"},{"type":"link","label":"Manage Departments","href":"/admin/organization/organizations","docId":"admin/organization/organizations"},{"type":"link","label":"Installed Packages","href":"/admin/organization/installed-packages","docId":"admin/organization/installed-packages"},{"type":"link","label":"Import Data","href":"/admin/organization/import","docId":"admin/organization/import"},{"type":"link","label":"Audit logs","href":"/admin/organization/audit-logs","docId":"admin/organization/audit-logs"},{"type":"link","label":"White Label","href":"/admin/organization/white-label","docId":"admin/organization/white-label"}],"href":"/admin/organization/"},{"type":"category","label":"Manage Data Access","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Control Who Sees What","href":"/admin/permissions/overview","docId":"admin/permissions/overview"},{"type":"link","label":"Profiles","href":"/admin/permissions/profile","docId":"admin/permissions/profile"},{"type":"link","label":"Permission Sets","href":"/admin/permissions/permission-set","docId":"admin/permissions/permission-set"},{"type":"link","label":"Object Permissions","href":"/admin/permissions/object-permissions","docId":"admin/permissions/object-permissions"},{"type":"link","label":"Field Permissions","href":"/admin/permissions/field-permissions","docId":"admin/permissions/field-permissions"},{"type":"link","label":"Application Permissions","href":"/admin/permissions/app-permissions","docId":"admin/permissions/app-permissions"},{"type":"link","label":"Divisions","href":"/admin/permissions/division","docId":"admin/permissions/division"},{"type":"link","label":"Restriction Rules","href":"/admin/permissions/restriction-rules","docId":"admin/permissions/restriction-rules"},{"type":"link","label":"Sharing Rules","href":"/admin/permissions/sharing-rules","docId":"admin/permissions/sharing-rules"},{"type":"link","label":"Trigger managed permissions","href":"/admin/permissions/before-find","docId":"admin/permissions/before-find"}],"href":"/admin/permissions/"},{"type":"category","collapsed":false,"label":"Integrations","items":[{"type":"link","label":"External Data Sources","href":"/integration/external-datasources","docId":"integration/external-datasources"},{"type":"link","label":"Node-Red","href":"/integration/node-red","docId":"integration/node-red"}],"collapsible":true,"href":"/integration"},{"type":"category","collapsed":false,"label":"Plugins","items":[{"type":"link","label":"DingTalk","href":"/plugins/integration-ding","docId":"plugins/integration-ding"},{"type":"link","label":"WeChat Work","href":"/plugins/integration-qywx","docId":"plugins/integration-qywx"}],"collapsible":true,"href":"/plugins"}],"developer":[{"type":"category","label":"Getting Started","collapsed":false,"items":[{"type":"link","label":"What is Steedos DX?","href":"/developer","docId":"developer"}],"collapsible":true},{"type":"category","label":"Setup Project","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Overview","href":"/developer/setup/overview","docId":"developer/setup/overview"},{"type":"link","label":"Sample Project on GitHub","href":"/developer/setup/sample-repository","docId":"developer/setup/sample-repository"},{"type":"link","label":"Create a New Project","href":"/developer/setup/create-steedos-app","docId":"developer/setup/create-steedos-app"},{"type":"link","label":"Install Steedos Cli","href":"/developer/setup/steedos-cli","docId":"developer/setup/steedos-cli"},{"type":"link","label":"Run Project","href":"/developer/setup/project-start","docId":"developer/setup/project-start"}],"href":"/developer/setup/"},{"type":"category","label":"Package Development","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Overview","href":"/developer/package/overview","docId":"developer/package/overview"},{"type":"category","label":"Metadata","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Automation Metadata","href":"/developer/package/metadata/metadata-automation","docId":"developer/package/metadata/metadata-automation"},{"type":"link","label":"Object Metadata","href":"/developer/package/metadata/metadata-object","docId":"developer/package/metadata/metadata-object"},{"type":"link","label":"Permission Metadata","href":"/developer/package/metadata/metadata-permissions","docId":"developer/package/metadata/metadata-permissions"},{"type":"link","label":"UI Metadata","href":"/developer/package/metadata/metadata-ui","docId":"developer/package/metadata/metadata-ui"}],"href":"/developer/package/metadata/"},{"type":"link","label":"Synchronize Metadata","href":"/developer/package/sync-metadata","docId":"developer/package/sync-metadata"},{"type":"link","label":"Package Installation","href":"/developer/package/package-install","docId":"developer/package/package-install"},{"type":"link","label":"Package Publishing","href":"/developer/package/package-publish","docId":"developer/package/package-publish"}],"href":"/developer/package/"},{"type":"category","label":"Service Development","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Overview","href":"/developer/service/overview","docId":"developer/service/overview"},{"type":"link","label":"Package Service","href":"/developer/service/package-service","docId":"developer/service/package-service"},{"type":"link","label":"REST API","href":"/developer/service/action-api","docId":"developer/service/action-api"},{"type":"link","label":"Triggers","href":"/developer/service/action-trigger","docId":"developer/service/action-trigger"},{"type":"link","label":"ObjectQL","href":"/developer/service/objectql","docId":"developer/service/objectql"},{"type":"link","label":"Internationalization","href":"/developer/service/locale","docId":"developer/service/locale"},{"type":"category","label":"Moleculer Microservices Framework","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Actions","href":"/developer/service/moleculer/actions","docId":"developer/service/moleculer/actions"},{"type":"link","label":"Events","href":"/developer/service/moleculer/events","docId":"developer/service/moleculer/events"},{"type":"link","label":"REPL Console","href":"/developer/service/moleculer/repl","docId":"developer/service/moleculer/repl"}],"href":"/developer/service/moleculer/"},{"type":"category","label":"Platform Service Reference","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"GraphQL","href":"/developer/service/service-api/service-graphql","docId":"developer/service/service-api/service-graphql"},{"type":"link","label":"Push Notification","href":"/developer/service/service-api/service-push","docId":"developer/service/service-api/service-push"},{"type":"link","label":"SMS Notification","href":"/developer/service/service-api/service-sms","docId":"developer/service/service-api/service-sms"}],"href":"/developer/service/service-api/"}],"href":"/developer/service/"},{"type":"category","label":"Micro Page Builder","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Overview","href":"/developer/micro-page/overview","docId":"developer/micro-page/overview"},{"type":"link","label":"Quick Start","href":"/developer/micro-page/getting_start","docId":"developer/micro-page/getting_start"},{"type":"category","label":"AMIS Low-Code Framework","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuration and Components","href":"/developer/micro-page/amis/base_config","docId":"developer/micro-page/amis/base_config"},{"type":"link","label":"Data Scope and Data Chain","href":"/developer/micro-page/amis/data","docId":"developer/micro-page/amis/data"},{"type":"link","label":"Template Rendering","href":"/developer/micro-page/amis/tpl","docId":"developer/micro-page/amis/tpl"},{"type":"link","label":"Data Mapping","href":"/developer/micro-page/amis/data_mapping","docId":"developer/micro-page/amis/data_mapping"},{"type":"link","label":"Expressions","href":"/developer/micro-page/amis/expression","docId":"developer/micro-page/amis/expression"},{"type":"link","label":"Linkage Mechanism","href":"/developer/micro-page/amis/linkage","docId":"developer/micro-page/amis/linkage"},{"type":"link","label":"Event Actions","href":"/developer/micro-page/amis/event","docId":"developer/micro-page/amis/event"},{"type":"link","label":"Custom Styles","href":"/developer/micro-page/amis/styles","docId":"developer/micro-page/amis/styles"}],"href":"/developer/micro-page/amis/"},{"type":"link","label":"Custom Components","href":"/developer/micro-page/custom_components","docId":"developer/micro-page/custom_components"},{"type":"category","label":"Components Reference","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ObjectForm","href":"/developer/micro-page/components/object_form","docId":"developer/micro-page/components/object_form"},{"type":"link","label":"ObjectListView","href":"/developer/micro-page/components/object_listview","docId":"developer/micro-page/components/object_listview"},{"type":"link","label":"ObjectTable","href":"/developer/micro-page/components/object_table","docId":"developer/micro-page/components/object_table"},{"type":"link","label":"RecordDetailHeader","href":"/developer/micro-page/components/record_detail_header","docId":"developer/micro-page/components/record_detail_header"},{"type":"link","label":"RecordDetailRelatedList","href":"/developer/micro-page/components/record_detail_related_list","docId":"developer/micro-page/components/record_detail_related_list"}],"href":"/developer/micro-page/components/"}],"href":"/developer/micro-page/"},{"type":"category","label":"Steedos API","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Overview","href":"/developer/api/overview","docId":"developer/api/overview"},{"type":"link","label":"API Authentication","href":"/developer/api/api-validate","docId":"developer/api/api-validate"},{"type":"link","label":"GraphQL API","href":"/developer/api/graphql-api","docId":"developer/api/graphql-api"},{"type":"link","label":"OpenAPI","href":"/developer/api/openapi","docId":"developer/api/openapi"},{"type":"link","label":"SSO API","href":"/developer/api/api-jwt-sso","docId":"developer/api/api-jwt-sso"},{"type":"link","label":"Process API","href":"/developer/api/api-process","docId":"developer/api/api-process"}],"href":"/developer/api/"},{"type":"category","collapsed":false,"label":"Product","items":[{"type":"link","label":"Release Notes","href":"https://github.com/orgs/steedos/projects/9"},{"type":"link","label":"Contribute","href":"https://github.com/steedos/steedos-platform/blob/master/CONTRIBUTING.md"}],"collapsible":true}],"apps":[{"type":"category","label":"Getting Started","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"What is Low-code App?","href":"/apps/getting-started/overview","docId":"apps/getting-started/overview"},{"type":"link","label":"Self Hosting","href":"/apps/getting-started/deploy","docId":"apps/getting-started/deploy"}]},{"type":"category","label":"Spend Management","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Project Cost Management","href":"/apps/spend-management/project/","docId":"apps/spend-management/project/README"},{"type":"link","label":"Contract","href":"/apps/spend-management/contract/","docId":"apps/spend-management/contract/README"},{"type":"link","label":"Expense","href":"/apps/spend-management/expense/","docId":"apps/spend-management/expense/README"},{"type":"link","label":"Invoice Management","href":"/apps/spend-management/invoice/","docId":"apps/spend-management/invoice/README"},{"type":"link","label":"Supplier","href":"/apps/spend-management/supplier/","docId":"apps/spend-management/supplier/README"},{"type":"link","label":"Tender Management","href":"/apps/spend-management/tender/","docId":"apps/spend-management/tender/README"}],"href":"/apps/spend-management/"},{"type":"category","label":"Human Capital Management","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Employee Management","href":"/apps/human-capital-management/employee/","docId":"apps/human-capital-management/employee/README"},{"type":"link","label":"Attendance","href":"/apps/human-capital-management/attendance/","docId":"apps/human-capital-management/attendance/README"},{"type":"link","label":"Performance Evaluation","href":"/apps/human-capital-management/performance/","docId":"apps/human-capital-management/performance/README"}],"href":"/apps/human-capital-management/"},{"type":"category","label":"Customer Relationship Management","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Sales","href":"/apps/customer-relationship-management/sales/","docId":"apps/customer-relationship-management/sales/README"},{"type":"link","label":"Service","href":"/apps/customer-relationship-management/service/","docId":"apps/customer-relationship-management/service/README"}],"href":"/apps/customer-relationship-management/"},{"type":"category","label":"Collaboration Tools","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Approval King","href":"/apps/collaboration/approval-king/","docId":"apps/collaboration/approval-king/README"},{"type":"link","label":"Milestone","href":"/apps/collaboration/milestone/","docId":"apps/collaboration/milestone/README"}],"href":"/apps/collaboration/"}]},"docs":{"admin":{"id":"admin","title":"Set Up and Maintain Your Steedos Organization","description":"As a Steedos administrator\u2014that is, a user assigned to the Administrator profile\u2014you\u2019re responsible for setting up your steedos organization, which means adding users and configuring the system for your needs."},"admin/organization/audit-logs":{"id":"admin/organization/audit-logs","title":"Audit logs","description":"The audit log is the report of all the activities done in your Steedos account. It will capture and display events automatically by recording who performed an activity, what when, and where the activity was performed, along with other information such as IP address.","sidebar":"platform"},"admin/organization/company-info":{"id":"admin/organization/company-info","title":"Company Info","description":"Use the Company Information page in Setup to track what\u2019s important about your company\u2019s organization in Steedos. This page contains the information that was provided when your company signed up with Steedos.","sidebar":"platform"},"admin/organization/import":{"id":"admin/organization/import","title":"Import Data Into Steedos","description":"Steedos offers several ways to import your data. You can import up to 50,000 records into Steedos.","sidebar":"platform"},"admin/organization/installed-packages":{"id":"admin/organization/installed-packages","title":"Installed Packages","description":"You can install packages into your Steedos organization, and then configure and manage them. To view the packages you\u2019ve installed, from Setup, select Installed Packages.","sidebar":"platform"},"admin/organization/organizations":{"id":"admin/organization/organizations","title":"Manage Departments","description":"The Department Management feature allows you to easily manage and organize departments within your organization. With this feature, you can create, edit, and delete departments as well as assign employees to specific departments.","sidebar":"platform"},"admin/organization/README":{"id":"admin/organization/README","title":"Setup Your Organization","description":"","sidebar":"platform"},"admin/organization/users":{"id":"admin/organization/users","title":"Manage Users","description":"In Steedos, each user is uniquely identified with a username, password, and profile. Together with other settings, the profile determines which tasks a user can perform, what data the user can see, and what the user can do with the data.","sidebar":"platform"},"admin/organization/white-label":{"id":"admin/organization/white-label","title":"White Label","description":"White Label feature will allow you to remove the Steedos branding from the Steedos platform and add your own custom logo and text.","sidebar":"platform"},"admin/permissions/app-permissions":{"id":"admin/permissions/app-permissions","title":"Application Permissions","description":"Steedos supports application authorization based on permission sets, which can be used to restrict users under a certain permission set/profile to only see certain applications.","sidebar":"platform"},"admin/permissions/before-find":{"id":"admin/permissions/before-find","title":"Trigger managed permissions","description":"While Steedos provides various built-in solutions to easily achieve precise field and record level permission control as described above, some permission requirements in unique project scenarios may not be met by these methods alone. Therefore, the Steedos permission engine also incorporates beforeFind triggers, which allow personalized and more advanced permission issues to be addressed through code.","sidebar":"platform"},"admin/permissions/division":{"id":"admin/permissions/division","title":"Organize Data with Divisions","description":"Divisions let you segment your organization\'s data into logical sections, making searches, reports, and list views more meaningful to users. Divisions are useful for organizations with extremely large amounts of data.","sidebar":"platform"},"admin/permissions/field-permissions":{"id":"admin/permissions/field-permissions","title":"Field Permissions","description":"Field permissions specify the access level for each field in an object.","sidebar":"platform"},"admin/permissions/index":{"id":"admin/permissions/index","title":"Manage Data Access","description":"Steedos provides a flexible, layered data sharing design that lets admins control user access to data. Managing data access enhances security by exposing only data that\u2019s relevant to users. Use permission sets, permission set groups, and profiles to control the objects and fields users can access. Use sharing rules to specify the individual records that users can view and edit.","sidebar":"platform"},"admin/permissions/object-permissions":{"id":"admin/permissions/object-permissions","title":"Object Permissions","description":"Object permissions specify the base-level access users have to create, read, edit, and delete records for each object. You can manage object permissions in permission sets and profiles.","sidebar":"platform"},"admin/permissions/overview":{"id":"admin/permissions/overview","title":"Control Who Sees What","description":"Steedos data sharing lets you expose specific data sets to individuals and groups of users. Permission sets, permission set groups, and profiles provide object-level and field-level security by controlling access. Record-level sharing settings, user roles, and sharing rules control the individual records that users can view and edit.","sidebar":"platform"},"admin/permissions/permission-set":{"id":"admin/permissions/permission-set","title":"Permission Sets","description":"A permission set is a collection of settings and permissions that give users access to various tools and functions. Permission sets extend users\u2019 functional access without changing their profiles and are the recommended way to manage your users\u2019 permissions.","sidebar":"platform"},"admin/permissions/profile":{"id":"admin/permissions/profile","title":"Profiles","description":"Profiles define how users access objects and data, and what they can do within the application. When you create users, you assign a profile to each one.","sidebar":"platform"},"admin/permissions/restriction-rules":{"id":"admin/permissions/restriction-rules","title":"Restriction Rules","description":"Restriction rules let you enhance your security by allowing certain users to access only specified records. They prevent users from accessing records that can contain sensitive data or information that isn\u2019t essential to their work. Restriction rules filter the records that a user has access to so that they can access only the records that match the criteria you specify.","sidebar":"platform"},"admin/permissions/sharing-rules":{"id":"admin/permissions/sharing-rules","title":"Sharing Rules","description":"Use sharing rules to extend sharing access to users in public groups, roles, or territories. Sharing rules give particular users greater access by making automatic exceptions to your org-wide sharing settings.","sidebar":"platform"},"apps/collaboration/approval-king/README":{"id":"apps/collaboration/approval-king/README","title":"Approval King: Streamlining Your Approval Processes","description":"Approval King is an innovative process automation solution designed to streamline and simplify the approval workflows within an organization. By leveraging cutting-edge technology, Approval King transforms traditional, cumbersome approval processes into a seamless, efficient, and transparent system. It empowers organizations to manage approvals with ease, ensuring compliance, enhancing productivity, and accelerating decision-making.","sidebar":"apps"},"apps/collaboration/milestone/README":{"id":"apps/collaboration/milestone/README","title":"Steedos Milestone: Project Task Management System","description":"The Steedos Project Task Management System is an application developed on the Steedos low-code platform, designed to help businesses efficiently plan, track, and manage project tasks. With its flexible customization features, it meets the project management needs of different enterprises, enhancing team collaboration efficiency and ensuring projects are completed on time and to quality standards.","sidebar":"apps"},"apps/collaboration/README":{"id":"apps/collaboration/README","title":"Collaboration Tools","description":"Enterprise Collaboration System (ECS) are comprehensive information systems designed to support communication, collaboration, and information sharing among employees within an organization. These systems typically offer a range of tools and features to support team collaboration, project management, document sharing, instant messaging, and other work-related activities.","sidebar":"apps"},"apps/customer-relationship-management/README":{"id":"apps/customer-relationship-management/README","title":"Customer Relationship Management","description":"Customer Relationship Management (CRM) is a combination of strategies and technologies used by companies to manage and analyze customer interactions and data throughout the customer lifecycle. The primary goal of CRM is to improve business relationships with customers, assist in customer retention, and drive sales growth. A CRM system helps companies stay connected to customers, streamline processes, and improve profitability.","sidebar":"apps"},"apps/customer-relationship-management/sales/README":{"id":"apps/customer-relationship-management/sales/README","title":"Steedos Sales Management System","description":"In the competitive landscape of sales, efficiency and customer relationship are key. The Steedos Sales Management System, is designed to empower sales teams with the tools they need for success. Built on the Steedos low-code platform, this system offers a highly customizable and user-friendly experience.","sidebar":"apps"},"apps/customer-relationship-management/service/README":{"id":"apps/customer-relationship-management/service/README","title":"Steedos Service Management System","description":"In today\'s rapidly changing business environment, delivering exceptional customer service is key to success. Steedos Service Management System is designed to provide businesses with a comprehensive service management solution. Built on the Steedos low-code platform, this system offers a highly customizable and user-friendly experience.","sidebar":"apps"},"apps/getting-started/deploy":{"id":"apps/getting-started/deploy","title":"Self Hosting","description":"Follow these steps to deploy Steedos Apps on Docker.","sidebar":"apps"},"apps/getting-started/overview":{"id":"apps/getting-started/overview","title":"What is Low-code App?","description":"In traditional enterprise application development, every feature and module required coding from scratch. This not only consumed a significant amount of time but also incurred high development costs. Moreover, when business requirements changed, modifying and optimizing the application became complex and challenging.","sidebar":"apps"},"apps/human-capital-management/attendance/README":{"id":"apps/human-capital-management/attendance/README","title":"Attendance Management","description":"Steedos Attendance Management System is an efficient and modern attendance management software, designed specifically to meet the attendance management needs of various enterprises. Developed on the Steedos low-code platform, the system not only inherits the platform\'s flexibility and high customizability but also supports private deployment, ensuring absolute security and privacy of enterprise data.","sidebar":"apps"},"apps/human-capital-management/employee/README":{"id":"apps/human-capital-management/employee/README","title":"Employee Lifecycle Management System","description":"In modern enterprise management, the Employee Lifecycle Management System (ELMS) plays a crucial role. It not only enhances the efficiency of human resource management but also strengthens employees\' sense of belonging and satisfaction. Based on the Steedos low-code platform, we have designed a comprehensive employee lifecycle management system aimed at simplifying and optimizing every stage from onboarding to offboarding.","sidebar":"apps"},"apps/human-capital-management/performance/README":{"id":"apps/human-capital-management/performance/README","title":"Steedos Performance Evaluation System","description":"In the modern corporate landscape, ensuring the continuous growth of a company and the professional development of its employees is paramount. Performance evaluation plays a crucial role in this process. With the Steedos low-code platform, we present a comprehensive solution for performance evaluation, ensuring that each employee\'s performance is assessed fairly and accurately.","sidebar":"apps"},"apps/human-capital-management/README":{"id":"apps/human-capital-management/README","title":"Human Capital Management","description":"HCM, standing for Human Capital Management, is an integrated approach that covers the entire lifecycle of an employee within an organization. It encompasses activities related to recruiting, onboarding, training, performance management, compensation, benefits, and offboarding.","sidebar":"apps"},"apps/spend-management/contract/README":{"id":"apps/spend-management/contract/README","title":"Steedos Contract Lifecycle Management System","description":"In the modern business landscape, contract management is paramount, impacting a company\'s profits, compliance, and risk management. Leveraging the Steedos low-code platform, we offer a comprehensive solution for managing the entire lifecycle of a contract, ensuring every phase is efficiently handled.","sidebar":"apps"},"apps/spend-management/expense/README":{"id":"apps/spend-management/expense/README","title":"Steedos Expense: Smart, Efficient, One-stop Reimbursement Experience","description":"In daily corporate operations, reimbursement management is often a tedious part of financial tasks. Steedos Expense Solution, based on Steedos\' low-code platform, builds a comprehensive, intelligent reimbursement process management system for you, focusing on providing an efficient, standardized reimbursement experience for enterprises.","sidebar":"apps"},"apps/spend-management/invoice/README":{"id":"apps/spend-management/invoice/README","title":"Steedos Invoice Management System","description":"In modern enterprise management, invoice processing is a key financial process. The Steedos Invoice Management System is a solution developed on a low-code platform, designed to simplify and automate the invoice processing workflow, increase efficiency, reduce errors, and ensure financial compliance.","sidebar":"apps"},"apps/spend-management/project/README":{"id":"apps/spend-management/project/README","title":"Project Cost Management System","description":"The Project Cost Management System is an application developed on the Steedos low-code platform, designed to help businesses effectively track and manage project costs. This system offers a comprehensive set of tools for monitoring project budgets, actual expenditures, labor costs, travel expenses, etc., ensuring that project costs are kept within budget, thereby enhancing project profitability and management efficiency.","sidebar":"apps"},"apps/spend-management/README":{"id":"apps/spend-management/README","title":"Spend Management","description":"Spend Management refers to the process by which enterprises manage and control all their expenditures, including direct expenses (such as raw materials and production costs) and indirect expenses (such as office supplies, travel, and entertainment costs). The goal of spend management is to reduce costs and improve the financial performance of the enterprise by optimizing procurement processes, negotiating more favorable supplier contracts, implementing cost control measures, and more.","sidebar":"apps"},"apps/spend-management/supplier/README":{"id":"apps/spend-management/supplier/README","title":"Steedos Supplier Management System","description":"In today\'s globalized business environment, selecting the right suppliers and maintaining good supplier relationships is crucial. The Steedos Supplier Management System offers businesses a centralized solution to systematically manage supplier information, evaluate their qualifications, and optimize interactions with them.","sidebar":"apps"},"apps/spend-management/tender/README":{"id":"apps/spend-management/tender/README","title":"Steedos Tender Management System","description":"The Steedos Tender Management System, developed on the Steedos low-code platform, is a highly customizable solution designed to streamline the tendering process for businesses and government agencies. It aims to simplify the tendering workflow, enhance efficiency and transparency, and ensure fairness and compliance in tendering activities.","sidebar":"apps"},"automation":{"id":"automation","title":"Automate Your Business Processes","description":"Instead of relying on your users to perform each part of a business process, automate it! The benefits are two-fold behind-the-scenes automation, and approval automation. You\'ll be happy to know that these tools don\'t require you to write code\u2014they\'re all point-and-click.","sidebar":"platform"},"automation/approval-king/admin-guide":{"id":"automation/approval-king/admin-guide","title":"Admin Guide","description":"Form design","sidebar":"platform"},"automation/approval-king/getting-started":{"id":"automation/approval-king/getting-started","title":"Users Started","description":"Upon logging into the system, you can access the \\"Process\\" module, where you can initiate, approve, and inquire about application forms.","sidebar":"platform"},"automation/approval-king/index":{"id":"automation/approval-king/index","title":"Approval King","description":"Deploy quickly, monitor effectively, and continuously optimize various business processes.","sidebar":"platform"},"automation/approval-process":{"id":"automation/approval-process","title":"Approval Processes","description":"It\u2019s likely that you\u2019re familiar with process automation in the form of workflow rules. Approval processes take automation one step further, letting you specify a sequence of steps that are required to approve a record.","sidebar":"platform"},"automation/automated-actions":{"id":"automation/automated-actions","title":"Automated Actions","description":"An automated action is a reusable component that performs some sort of action behind the scenes\u2014like updating a field or sending an email. After you create an automated action, add it to a process, milestone, or other automated process.","sidebar":"platform"},"automation/workflow-rules":{"id":"automation/workflow-rules","title":"Workflow Rules","description":"Workflow rules let you automate standard internal procedures and processes to save time across your org. A workflow rule is the main container for a set of workflow instructions. These instructions can always be summed up in an if/then statement.","sidebar":"platform"},"deploy":{"id":"deploy","title":"Self Hosting","description":"","sidebar":"platform"},"deploy/deploy-docker":{"id":"deploy/deploy-docker","title":"Steedos Docker Deployment Guide","description":"This document will guide you on how to deploy the Steedos platform on your server using Docker.","sidebar":"platform"},"deploy/gitpod":{"id":"deploy/gitpod","title":"Try with Gitpod","description":"Gitpod is an online Integrated Development Environment (IDE) which is used for software development. It\'s a cloud-based service that allows developers to work on their projects directly from their web browser. This service provides a complete dev environment for every Git project, including pull requests and branches.","sidebar":"platform"},"deploy/intranet":{"id":"deploy/intranet","title":"Intranet","description":"Follow the steps below to deploy Steedos in an Ubuntu 20.04 intranet environment.","sidebar":"platform"},"deploy/steedos-config":{"id":"deploy/steedos-config","title":"Instance Configuration","description":"This page provides instructions on how to configure your self-hosted Steedos instance.","sidebar":"platform"},"developer":{"id":"developer","title":"What is Steedos DX?","description":"Steedos Developer Experience (DX) is a new way of managing and developing applications on the Steedos low-code platform throughout their entire lifecycle. It combines the best features of a low-code platform, achieving source-driven development, team collaboration with governance, and a new level of custom app development on Steedos.","sidebar":"developer"},"developer/api/api-jwt-sso":{"id":"developer/api/api-jwt-sso","title":"SSO API","description":"\u901a\u8fc7jwt\u5b9e\u73b0\u5916\u63a5\u5e94\u7528\u4e0e\u9b54\u65b9\u5e73\u53f0\u53cc\u5411\u5355\u70b9\u767b\u5f55\u3002","sidebar":"developer"},"developer/api/api-process":{"id":"developer/api/api-process","title":"Process API","description":"\u6839\u636e\u6d41\u7a0b\u7684\u5143\u6570\u636e\u5b9a\u4e49\uff0c\u81ea\u52a8\u751f\u6210\u5ba1\u6279\u76f8\u5173API\u3002","sidebar":"developer"},"developer/api/api-validate":{"id":"developer/api/api-validate","title":"API Authentication","description":"Before calling an api, api authentication must be performed first. Steedos supports multiple ways to authenticate apis, making api calls easy and flexible. Moreover, it can also achieve functions such as single sign-on, validating login status, and logging out, making interface calls even more flexible and convenient.","sidebar":"developer"},"developer/api/graphql-api":{"id":"developer/api/graphql-api","title":"GraphQL API","description":"GraphQL Console","sidebar":"developer"},"developer/api/openapi":{"id":"developer/api/openapi","title":"OpenAPI","description":"- OpenAPI API Documentation","sidebar":"developer"},"developer/api/overview":{"id":"developer/api/overview","title":"Overview","description":"Steedos provides a comprehensive suite of robust APIs, allowing a plethora of opportunities for enterprise integration, development, and functionality enhancement.","sidebar":"developer"},"developer/api/README":{"id":"developer/api/README","title":"API Guide","description":"Steedos, recognized as a trailblazer in low-code development platform, also provides a comprehensive suite of robust APIs, allowing a plethora of opportunities for enterprise integration, development, and functionality enhancement.","sidebar":"developer"},"developer/micro-page/amis/base_config":{"id":"developer/micro-page/amis/base_config","title":"Configuration and Components","description":"Welcome to the AMIS documentation. In this section, we will delve into the core concept of schema, which is the key element for defining the structure and behavior of components in AMIS.","sidebar":"developer"},"developer/micro-page/amis/data":{"id":"developer/micro-page/amis/data","title":"Data Scope and Data Chain","description":"Basic Concepts: Data Scope and Data Chain","sidebar":"developer"},"developer/micro-page/amis/data_mapping":{"id":"developer/micro-page/amis/data_mapping","title":"Data Mapping","description":"Data mapping is a powerful feature that allows users to fetch variable values from the current data chain by using template strings, such as $ or $xxx. This method is mainly used in scenarios like template strings, customizing API request body formats, etc.","sidebar":"developer"},"developer/micro-page/amis/event":{"id":"developer/micro-page/amis/event","title":"Event Actions","description":"In AMIS, events and actions are key to implementing complex UI interactions. They allow developers to listen for component events and respond with corresponding actions without worrying about component hierarchy. The capabilities of events and actions include, but are not limited to:","sidebar":"developer"},"developer/micro-page/amis/expression":{"id":"developer/micro-page/amis/expression","title":"Expressions","description":"In AMIS, expressions are a powerful tool that allows users to dynamically handle data in various scenarios. Expressions can be used for template variable retrieval, API endpoint parameter retrieval, data mapping, conditions for component visibility, form default values, and more. AMIS supports two syntaxes for expressions: pure JavaScript expressions and expressions wrapped in ${}.","sidebar":"developer"},"developer/micro-page/amis/linkage":{"id":"developer/micro-page/amis/linkage","title":"Linkage Mechanism","description":"In AMIS, the linkage mechanism is an important feature for achieving dynamic page interactions. Through linkage, components can be controlled to show, hide, or disable based on certain conditions, or to trigger interface requests. Linkage configurations are usually based on expressions.","sidebar":"developer"},"developer/micro-page/amis/README":{"id":"developer/micro-page/amis/README","title":"AMIS Frontend Low-Code Framework","description":"Introduction to AMIS","sidebar":"developer"},"developer/micro-page/amis/styles":{"id":"developer/micro-page/amis/styles","title":"Custom Styles","description":"In many components, there is a className property. By setting the component\'s className, you can change its style.","sidebar":"developer"},"developer/micro-page/amis/tpl":{"id":"developer/micro-page/amis/tpl","title":"Template Rendering","description":"Welcome to the AMIS documentation. In this section, we will explore the template rendering feature in AMIS, which is a function borrowed from other template engines, aimed at providing flexibility in rendering text and data structures.","sidebar":"developer"},"developer/micro-page/components/object_form":{"id":"developer/micro-page/components/object_form","title":"ObjectForm","description":"Steedos\u5fae\u9875\u9762\u5f15\u64ce\uff0c\u5185\u7f6e\u5bf9\u8c61\u8868\u5355\u7ec4\u4ef6 ObjectForm\uff0c\u501f\u52a9amis\u6e32\u67d3\u5668\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u5feb\u901f\u751f\u6210\u4e00\u4e2a\u529f\u80fd\u5b8c\u5584\u7684\u5bf9\u8c61\u8868\u5355\u7ec4\u4ef6\u3002","sidebar":"developer"},"developer/micro-page/components/object_listview":{"id":"developer/micro-page/components/object_listview","title":"ObjectListView","description":"Steedos\u5fae\u9875\u9762\u5f15\u64ce\uff0c\u5185\u7f6e\u5217\u8868\u89c6\u56fe\u7ec4\u4ef6 ObjectListView\uff0c\u501f\u52a9amis\u6e32\u67d3\u5668\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u5feb\u901f\u751f\u6210\u4e00\u4e2a\u529f\u80fd\u5b8c\u5584\u7684\u5217\u8868\u89c6\u56fe\u7ec4\u4ef6\u3002","sidebar":"developer"},"developer/micro-page/components/object_table":{"id":"developer/micro-page/components/object_table","title":"ObjectTable","description":"This is an object table component based on the Steedos object, which displays object records as a table while including functionalities for CRUD and other operation buttons. The main difference with the Object List component is that this component allows for configuration of the table\'s displayed columns, filtering conditions, and other basic properties.","sidebar":"developer"},"developer/micro-page/components/README":{"id":"developer/micro-page/components/README","title":"Components Reference","description":"Amis native components","sidebar":"developer"},"developer/micro-page/components/record_detail_header":{"id":"developer/micro-page/components/record_detail_header","title":"RecordDetailHeader","description":"Steedos\u5fae\u9875\u9762\u5f15\u64ce\uff0c\u5185\u7f6e\u6807\u9898\u9762\u677f\u7ec4\u4ef6 RecordDetailHeader\uff0c\u501f\u52a9amis\u6e32\u67d3\u5668\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u5feb\u901f\u751f\u6210\u4e00\u4e2a\u529f\u80fd\u5b8c\u5584\u7684\u6807\u9898\u9762\u677f\u7ec4\u4ef6\u3002","sidebar":"developer"},"developer/micro-page/components/record_detail_related_list":{"id":"developer/micro-page/components/record_detail_related_list","title":"RecordDetailRelatedList","description":"Steedos\u5fae\u9875\u9762\u5f15\u64ce\uff0c\u5185\u7f6e\u76f8\u5173\u8868\u7ec4\u4ef6 RecordDetailRelatedList\uff0c\u501f\u52a9amis\u6e32\u67d3\u5668\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u5feb\u901f\u751f\u6210\u4e00\u4e2a\u529f\u80fd\u5b8c\u5584\u7684\u76f8\u5173\u8868\u89c6\u56fe\u7ec4\u4ef6\u3002","sidebar":"developer"},"developer/micro-page/custom_components":{"id":"developer/micro-page/custom_components","title":"Custom Components","description":"Introduction","sidebar":"developer"},"developer/micro-page/getting_start":{"id":"developer/micro-page/getting_start","title":"Quick Start","description":"In this section, we will introduce how to build a simple micro page (taking an application micro page as an example) and explain how to view the current data of components.","sidebar":"developer"},"developer/micro-page/overview":{"id":"developer/micro-page/overview","title":"Overview","description":"We are proud to introduce the Steedos Micro Page Builder, a powerful toolkit for micro page development based on Baidu AMIS technology. Steedos supports the creation of custom pages and components, equipped with intuitive visual design tools.","sidebar":"developer"},"developer/micro-page/README":{"id":"developer/micro-page/README","title":"Micro Page Builder","description":"Introducing Steedos Micro Page Builder, a powerful micro-page development toolkit rooted in Baidu AMIS technology. Drawing parallels with the renowned Salesforce Lightning Page Builder, this platform facilitates the creation of custom pages and components, made even more accessible with its visual design utilities.","sidebar":"developer"},"developer/package/metadata/metadata-automation":{"id":"developer/package/metadata/metadata-automation","title":"Automation Metadata","description":"Overview","sidebar":"developer"},"developer/package/metadata/metadata-object":{"id":"developer/package/metadata/metadata-object","title":"Object Metadata","description":"Object .object.yml","sidebar":"developer"},"developer/package/metadata/metadata-permissions":{"id":"developer/package/metadata/metadata-permissions","title":"Permission Metadata","description":"Define metadata related to permissions.","sidebar":"developer"},"developer/package/metadata/metadata-ui":{"id":"developer/package/metadata/metadata-ui","title":"UI Metadata","description":"Overview","sidebar":"developer"},"developer/package/metadata/README":{"id":"developer/package/metadata/README","title":"Metadata","description":"Introduction","sidebar":"developer"},"developer/package/overview":{"id":"developer/package/overview","title":"Overview","description":"If you\u2019re new to packaging, you can think about a package as a container that you fill with metadata. It contains a set of related features, customizations, and schema. You use packages to move metadata from one Steedos deployment to another.","sidebar":"developer"},"developer/package/package-install":{"id":"developer/package/package-install","title":"Package Installation","description":"The Steedos platform can extend its capabilities by installing additional packages. Below is the process for installing Steedos packages from npm repositories or private repositories.","sidebar":"developer"},"developer/package/package-publish":{"id":"developer/package/package-publish","title":"Package Publishing","description":"Overview","sidebar":"developer"},"developer/package/README":{"id":"developer/package/README","title":"Package Development","description":"If you\u2019re new to packaging, you can think about a package as a container that you fill with metadata. It contains a set of related features, customizations, and schema. You use packages to move metadata from one Steedos deployment to another.","sidebar":"developer"},"developer/package/sync-metadata":{"id":"developer/package/sync-metadata","title":"Synchronize Metadata","description":"By using the VS Code plugin, you can synchronize the metadata of visual development with the project source code, achieve version management of metadata, and further utilize DevOps tools for team development and automation.","sidebar":"developer"},"developer/service/action-api":{"id":"developer/service/action-api","title":"REST API","description":"In the event that the standard API generated by the Steedos cannot satisfy the business requirements, you can write a custom API to handle business data on the server.","sidebar":"developer"},"developer/service/action-trigger":{"id":"developer/service/action-trigger","title":"Triggers","description":"By writing triggers, you can automatically trigger a piece of server-side code before and after record creation, deletion, and changes, achieving personalized data validation and processing.","sidebar":"developer"},"developer/service/locale":{"id":"developer/service/locale","title":"Internationalization","description":"Steedos is a low-code platform that supports multiple languages. We can override the default translated content of the system by writing internationalization resource files in the software package, which enables internationalization.","sidebar":"developer"},"developer/service/moleculer/actions":{"id":"developer/service/moleculer/actions","title":"Actions","description":"The actions are the callable/public methods of the service. The action calling represents a remote-procedure-call (RPC). It has request parameters & returns response, like a HTTP request.","sidebar":"developer"},"developer/service/moleculer/events":{"id":"developer/service/moleculer/events","title":"Events","description":"Steedos has a built-in event bus to support Event-driven architecture and to send events to local and remote services.","sidebar":"developer"},"developer/service/moleculer/README":{"id":"developer/service/moleculer/README","title":"Moleculer Microservices Framework","description":"Moleculer is a fast, powerful, and flexible microservices framework. Its core philosophy revolves around building applications by decomposing them into services. Each service is autonomous, allowing for independent deployment, scaling, and maintenance. Moleculer provides a lightweight messaging system, simplifying and optimizing communication between services.","sidebar":"developer"},"developer/service/moleculer/repl":{"id":"developer/service/moleculer/repl","title":"REPL Console","description":"REPL is an interactive developer console for Steedos.","sidebar":"developer"},"developer/service/objectql":{"id":"developer/service/objectql","title":"ObjectQL","description":"ObjectQL is a query language designed for interacting with data objects within the Steedos Platform. Similar in concept to SQL used in relational databases, ObjectQL allows users to perform CRUD operations (Create, Read, Update, Delete) on structured data stored as objects.","sidebar":"developer"},"developer/service/overview":{"id":"developer/service/overview","title":"Overview of Steedos Microservices Architecture","description":"In traditional monolithic applications, all functionalities and components are bundled into one large application. Over time, such an application can become extremely large and intricate, making maintenance, scaling, and deployment challenging. Microservices architecture tackles these challenges by breaking down large applications into small, independent, and interoperable services.","sidebar":"developer"},"developer/service/package-service":{"id":"developer/service/package-service","title":"Package Service","description":"The Steedos Platform is based on the Moleculer microservices architecture, where each package is a Moleculer Service. You can define actions, methods, and subscribe to events in the service.","sidebar":"developer"},"developer/service/README":{"id":"developer/service/README","title":"Service Development","description":"The Steedos Platform is based on the Moleculer microservices architecture, where each package is a Moleculer Service. You can define actions, methods, and subscribe to events in the service.","sidebar":"developer"},"developer/service/service-api/README":{"id":"developer/service/service-api/README","title":"Platform Service Reference","description":"","sidebar":"developer"},"developer/service/service-api/service-graphql":{"id":"developer/service/service-api/service-graphql","title":"GraphQL","description":"You can call the GraphQL microservice to execute GraphQL queries on the server-side.","sidebar":"developer"},"developer/service/service-api/service-push":{"id":"developer/service/service-api/service-push","title":"Push Notification","description":"Steedos\u652f\u6301\u5728\u7b2c\u4e09\u65b9\u5e94\u7528\u4e2d\u8c03\u7528\u63a5\u53e3\u6765\u53d1\u63a8\u9001\u901a\u77e5","sidebar":"developer"},"developer/service/service-api/service-sms":{"id":"developer/service/service-api/service-sms","title":"SMS Notification","description":"Applying for SMS Service","sidebar":"developer"},"developer/setup/create-steedos-app":{"id":"developer/setup/create-steedos-app","title":"Create a New Project","description":"The easiest way to setup a project is to use create-steedos-app. This CLI tool allows you to quickly start building a new steedos project and sets everything up for you.","sidebar":"developer"},"developer/setup/overview":{"id":"developer/setup/overview","title":"Overview","description":"Steedos DX Project is a workflow methodology for managing and developing Steedos applications, emphasizing a source-driven approach for more efficient version control and team collaboration. The Steedos DX project folder typically contains the following elements:","sidebar":"developer"},"developer/setup/project-start":{"id":"developer/setup/project-start","title":"Run Project","description":"The package of the Steedos Platform consists of metadata and microservices and needs to be loaded into the Steedos Platform to run.","sidebar":"developer"},"developer/setup/README":{"id":"developer/setup/README","title":"Setup Project","description":"Steedos Developer Experience (DX) is a new way to manage and develop apps on the Steedos Low-Code Platform across their entire lifecycle. It brings together the best of the Low-Code Platform to enable source-driven development, team collaboration with governance, and new levels of agility for custom app development on Steedos.","sidebar":"developer"},"developer/setup/sample-repository":{"id":"developer/setup/sample-repository","title":"Sample Project on GitHub","description":"To get started quickly, see the https://github.com/steedos-labs/contract GitHub repo. This standalone application contains an example Steedos DX project with multiple custom objects, sample data.","sidebar":"developer"},"developer/setup/steedos-cli":{"id":"developer/setup/steedos-cli","title":"Install Steedos Cli","description":"Introduction","sidebar":"developer"},"getting-started/README":{"id":"getting-started/README","title":"What is Steedos?","description":"Steedos, an open-source low-code development platform, redefines the way enterprise applications are built. It enables users without a programming background to quickly launch and deploy applications, greatly simplifying the traditional development process. For experienced developers, Steedos offers a powerful set of tools and frameworks to support in-depth customization and complex system integrations. This unique combination makes Steedos a truly adaptable platform for various business needs, whether it\'s rapid development of simple applications or advanced enterprise system integrations, all can be efficiently and flexibly realized on this platform.","sidebar":"platform"},"getting-started/tutorials/README":{"id":"getting-started/tutorials/README","title":"Steedos Tutorials","description":"","sidebar":"platform"},"getting-started/tutorials/the-basics/app":{"id":"getting-started/tutorials/the-basics/app","title":"Lesson 3: Creating Application","description":"Steedos allows users to create custom applications to meet various business needs. Custom applications are a collection of logically related objects, fields, functionalities, and layouts. This tutorial will guide you on how to create a Todos application in Steedos, and link it to the Projects and Todos objects.","sidebar":"platform"},"getting-started/tutorials/the-basics/object":{"id":"getting-started/tutorials/the-basics/object","title":"Lesson 1: Creating Objects","description":"Steedos offers powerful features that allow users to create and manage custom objects to meet specific business needs. Custom objects can be seen as tables in a database, storing data specific to an enterprise. This tutorial will detail how to create and use a custom object \u2014 the Todos object \u2014 in Steedos.","sidebar":"platform"},"getting-started/tutorials/the-basics/README":{"id":"getting-started/tutorials/the-basics/README","title":"The Basics","description":"In this tutorial, we will create a simple Todos application using Steedos. This application will allow users to add, view, and manage their to-do tasks.","sidebar":"platform"},"getting-started/tutorials/the-basics/relationship":{"id":"getting-started/tutorials/the-basics/relationship","title":"Lesson 2: Defining Relationships","description":"In Steedos, understanding and utilizing object relationships is key to building effective and feature-rich custom applications. Object relationships allow different objects to be connected, enabling data association and integration. This tutorial will explain the concept and steps of object relationships through a simple application example \u2014 linking Todos object to Projects object.","sidebar":"platform"},"getting-started/tutorials/the-basics/workflow-rules":{"id":"getting-started/tutorials/the-basics/workflow-rules","title":"Lesson 4: Workflow Rules","description":"In this section, we will delve into the automation features of Steedos, exploring how to use workflow rules to automate tasks. We will go through a practical case \u2013 creating a workflow rule that sends reminders to assignees (Assignees) when a task (such as the Todos object) is created, modified, or deleted.","sidebar":"platform"},"getting-started/user/download-apps":{"id":"getting-started/user/download-apps","title":"Download Apps","description":"Instructions for using the Steedos desktop and mobile clients.","sidebar":"platform"},"getting-started/user/overview":{"id":"getting-started/user/overview","title":"Overview of the Steedos Interface","description":"Steedos Platform is designed to empower users with a suite of tools that streamline the creation, management, and optimization of business applications. With its user-friendly interface and robust features, Steedos Platform enables you to harness the power of low-code development to drive innovation and efficiency within your organization.","sidebar":"platform"},"getting-started/user/README":{"id":"getting-started/user/README","title":"User Guide","description":"Steedos Platform is a comprehensive low-code development platform that allows users to build custom applications tailored to their unique business needs. It provides a flexible and intuitive environment for users to design, develop, and deploy applications with minimal coding required. Whether you\'re looking to manage customer relationships, streamline internal processes, or analyze data, Steedos Platform offers the versatility and scalability to meet your objectives.","sidebar":"platform"},"integration":{"id":"integration","title":"Extend the Reach of Your Organization","description":"Sometimes your users need to work with data and services that are outside your Steedos org. There\u2019s a variety of ways you can provide seamless access across org boundaries.","sidebar":"platform"},"integration/external-datasources":{"id":"integration/external-datasources","title":"External Data Sources","description":"An external data source specifies how to access an external system. External data sources have associated external objects, which your users and the Steedos platform use to interact with the external data and content.","sidebar":"platform"},"integration/node-red":{"id":"integration/node-red","title":"Node-Red","description":"Node-RED is a process-oriented programming tool that allows you to effortlessly connect IoT devices, APIs and online services together. It employs a browser-based editor which allows users to drag and drop different nodes onto a canvas, and connect them to create a flow. Node-RED also offers a plethora of nodes which enable users to easily interact with a diverse range of devices and services.https://Node-Red.org/\u3002","sidebar":"platform"},"no-code":{"id":"no-code","title":"Extend Steedos with Clicks, Not Code","description":"Ready to go beyond the basics of Steedos administration? Want to customize your org, push its boundaries, and enhance its functionality? You can do that and so much more without writing a single line of code. All you need is your mouse and a sense of adventure. Enhance your objects, data, and fields, customize your org\u2019s look and feel, augment your business processes, and even create apps\u2014all using point-and-click tools."},"no-code/application/app":{"id":"no-code/application/app","title":"Creating Your First Application","description":"The Steedos platform comes with built-in visual application building tools that empower you to customize Steedos to meet your business needs. You can also build your own applications to share and store information that\'s important to you, all without needing any programming knowledge.","sidebar":"platform"},"no-code/application/overview":{"id":"no-code/application/overview","title":"What is a Steedos Application?","description":"Within the Steedos platform, an Application is a software solution that supports specific business processes by integrating related functions and datasets. Applications can range from simple customer management tools to complex business management systems, providing customized user interfaces, database models, business logic, and integration services to meet the specific needs of a business.","sidebar":"platform"},"no-code/application/pages":{"id":"no-code/application/pages","title":"Micro Page Builder","description":"The Micro Page Builder in the Steedos platform is a powerful interface that allows users to design and customize their application pages using a drag-and-drop approach.","sidebar":"platform"},"no-code/application/README":{"id":"no-code/application/README","title":"Building Applications","description":"The Steedos platform comes with built-in visual application building tools that empower you to customize Steedos to meet your business needs.","sidebar":"platform"},"no-code/application/tab":{"id":"no-code/application/tab","title":"Tabs","description":"Tabs in Steedos applications serve as navigation elements, providing an intuitive way to access different objects, views, dashboards, or custom web pages. Here are the steps to create and manage tabs:","sidebar":"platform"},"no-code/customize/button":{"id":"no-code/customize/button","title":"Custom Button","description":"Create custom buttons for objects and design button functions using Amis.","sidebar":"platform"},"no-code/customize/fields/field-attributes":{"id":"no-code/customize/fields/field-attributes","title":"Field Attributes","description":"Each field has a set of properties that define the behavior and appearance of the field:","sidebar":"platform"},"no-code/customize/fields/field-type-autonumber":{"id":"no-code/customize/fields/field-type-autonumber","title":"Auto Number Field","description":"Automatically assigns a unique number to each record. The maximum length of any auto-number field is 30 characters, 20 of which are reserved for prefix or suffix text.","sidebar":"platform"},"no-code/customize/fields/field-type-summary":{"id":"no-code/customize/fields/field-type-summary","title":"Roll-Up Summary Field","description":"A roll-up summary field calculates values from related records, such as those in a related list. You can create a roll-up summary field to display a value in a master record based on the values of fields in a detail record. The detail record must be related to the master through a master-detail relationship. For example, you want to display the sum of invoice amounts for all related invoice custom object records in an account\u2019s Invoices related list. You can display this total in a custom account field called Total Invoice Amount.","sidebar":"platform"},"no-code/customize/fields/field-types":{"id":"no-code/customize/fields/field-types","title":"Basic Field Types","description":"Steedos supports many different field types. Pick the right type, or convert an existing one.","sidebar":"platform"},"no-code/customize/fields/README":{"id":"no-code/customize/fields/README","title":"Field Types","description":"In Steedos, fields (also known as columns) are the fundamental elements for storing data within custom or standard objects. Each field has a specific type, which defines the kind of data it can store, such as numbers, text, dates, or relationship links.","sidebar":"platform"},"no-code/customize/fields/relationship":{"id":"no-code/customize/fields/relationship","title":"Object Relationship Fields","description":"Create relationships to link objects with each other, so that when your users view records, they can also see related data. For example, link a custom object called Bugs to cases to track product defects that are associated with customer cases.","sidebar":"platform"},"no-code/customize/formula/cross-object":{"id":"no-code/customize/formula/cross-object","title":"What Is a Cross-Object Formula?","description":"A Cross-object formula is a formula that spans two related objects and references merge fields on those objects. A cross-object formula can reference merge fields from a master (\u201cparent\u201d) object if an object is on the detail side of a master-detail relationship. A cross-object formula also works with lookup relationships.","sidebar":"platform"},"no-code/customize/formula/datetime":{"id":"no-code/customize/formula/datetime","title":"Using Date, Date/Time, and Time Values in Formulas","description":"Date formulas are useful for managing payment deadlines, contract ages, or any other features of your organization that are time or date dependent.","sidebar":"platform"},"no-code/customize/formula/formula-field":{"id":"no-code/customize/formula/formula-field","title":"Formula Field Types","description":"The data type of a formula determines the type of data you expect returned from your formula.","sidebar":"platform"},"no-code/customize/formula/functions":{"id":"no-code/customize/formula/functions","title":"Formula Functions","description":"Use operators and functions when building formulas. All functions are available everywhere that you can include a formula such as formula fields, validation rules, approval processes, and workflow rules, unless otherwise specified.","sidebar":"platform"},"no-code/customize/formula/overview":{"id":"no-code/customize/formula/overview","title":"Formula Overview","description":"Where are Formulas Used in Steedos?","sidebar":"platform"},"no-code/customize/formula/README":{"id":"no-code/customize/formula/README","title":"Calculate Field Values with Formulas","description":"A formula is an algorithm that derives its value from other fields, expressions, or values. Formulas can help you automatically calculate the value of a field based on other fields.","sidebar":"platform"},"no-code/customize/listview":{"id":"no-code/customize/listview","title":"List Views","description":"View, edit, and create records from a list. List views are a great way to sort, prioritize, and analyze the records that are most important to users.","sidebar":"platform"},"no-code/customize/object":{"id":"no-code/customize/object","title":"Custom Objects","description":"Building applications on the Steedos platform often requires the creation of one or more custom objects to store all necessary business data. Custom objects can be considered as tables in a database, containing a series of fields where you can store data.","sidebar":"platform"},"no-code/customize/object-relationship":{"id":"no-code/customize/object-relationship","title":"Object Relationships","description":"Steedos\'s robust data model allows you to build complex data structures by defining relationships between objects. These relationships are the foundation for connecting various data points and sharing data across the entire platform.","sidebar":"platform"},"no-code/customize/page-layout":{"id":"no-code/customize/page-layout","title":"Page Layouts","description":"Page layouts control the layout and organization of buttons, fields and related lists on object record pages. They also help determine which fields are visible, read only, and required. Use page layouts to customize the content of record pages for your users.","sidebar":"platform"},"no-code/customize/README":{"id":"no-code/customize/README","title":"Set Up Your Data Your Way","description":"Optimize your Steedos data to fit the unique needs of your users. You can create your own objects with data that fits together in the ways that make the most sense for you.","sidebar":"platform"},"no-code/customize/validation-rules":{"id":"no-code/customize/validation-rules","title":"Validation Rules","description":"Improve the quality of your data using validation rules. Validation rules verify that the data a user enters in a record meets the standards you specify before the user can save the record. A validation rule can contain a formula or expression that evaluates the data in one or more fields and returns a value of \u201cTrue\u201d or \u201cFalse\u201d. Validation rules also include an error message to display to the user when the rule returns a value of \u201cTrue\u201d due to an invalid value.","sidebar":"platform"},"plugins":{"id":"plugins","title":"Steedos Plugins","description":"Steedos is a potent low-code development platform that empowers users and developers to extend and enhance the platform\'s capabilities through its flexible plugin architecture. With Steedos plugins, you can integrate new functionalities seamlessly, meet specific business needs, while maintaining the stability and reliability of the core system.","sidebar":"platform"},"plugins/integration-ding":{"id":"plugins/integration-ding","title":"DingTalk","description":"Steedos can integrate with DingTalk to achieve single sign-on, message push, and organization synchronization.","sidebar":"platform"},"plugins/integration-qywx":{"id":"plugins/integration-qywx","title":"WeChat Work","description":"Steedos can also integrate with WeChat Work to achieve single sign-on, message push, and organization synchronization.","sidebar":"platform"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.ddc601b6.js b/assets/js/935f2afb.ddc601b6.js new file mode 100644 index 0000000000..9162303441 --- /dev/null +++ b/assets/js/935f2afb.ddc601b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"platform":[{"type":"category","label":"Getting Started","collapsed":false,"items":[{"type":"link","label":"What is Steedos?","href":"/getting-started/","docId":"getting-started/README"},{"type":"category","label":"Tutorials","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"The Basics","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Lesson 1: Creating Objects","href":"/getting-started/tutorials/the-basics/object","docId":"getting-started/tutorials/the-basics/object"},{"type":"link","label":"Lesson 2: Defining Relationships","href":"/getting-started/tutorials/the-basics/relationship","docId":"getting-started/tutorials/the-basics/relationship"},{"type":"link","label":"Lesson 3: Creating Application","href":"/getting-started/tutorials/the-basics/app","docId":"getting-started/tutorials/the-basics/app"},{"type":"link","label":"Lesson 4: Workflow Rules","href":"/getting-started/tutorials/the-basics/workflow-rules","docId":"getting-started/tutorials/the-basics/workflow-rules"}],"href":"/getting-started/tutorials/the-basics/"}],"href":"/getting-started/tutorials/"},{"type":"category","label":"User Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Steedos Interface","href":"/getting-started/user/overview","docId":"getting-started/user/overview"},{"type":"link","label":"Download Apps","href":"/getting-started/user/download-apps","docId":"getting-started/user/download-apps"}],"href":"/getting-started/user/"},{"type":"category","collapsed":true,"label":"Self Hosting","items":[{"type":"link","label":"Docker","href":"/deploy/deploy-docker","docId":"deploy/deploy-docker"},{"type":"link","label":"Intranet","href":"/deploy/intranet","docId":"deploy/intranet"},{"type":"link","label":"Try with Gitpod","href":"/deploy/gitpod","docId":"deploy/gitpod"},{"type":"link","label":"Instance Configuration","href":"/deploy/steedos-config","docId":"deploy/steedos-config"}],"collapsible":true,"href":"/deploy"}],"collapsible":true},{"type":"category","label":"Building Applications","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Application Overview","href":"/no-code/application/overview","docId":"no-code/application/overview"},{"type":"link","label":"Creating Your First Application","href":"/no-code/application/app","docId":"no-code/application/app"},{"type":"link","label":"Micro Page Builder","href":"/no-code/application/pages","docId":"no-code/application/pages"},{"type":"link","label":"Tabs","href":"/no-code/application/tab","docId":"no-code/application/tab"}],"href":"/no-code/application/"},{"type":"category","label":"Data Model and Management","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Custom Objects","href":"/no-code/customize/object","docId":"no-code/customize/object"},{"type":"category","label":"Field Types","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Field Attributes","href":"/no-code/customize/fields/field-attributes","docId":"no-code/customize/fields/field-attributes"},{"type":"link","label":"Basic Field Types","href":"/no-code/customize/fields/field-types","docId":"no-code/customize/fields/field-types"},{"type":"link","label":"Auto Number Field","href":"/no-code/customize/fields/field-type-autonumber","docId":"no-code/customize/fields/field-type-autonumber"},{"type":"link","label":"Roll-Up Summary Field","href":"/no-code/customize/fields/field-type-summary","docId":"no-code/customize/fields/field-type-summary"},{"type":"link","label":"Object Relationship Fields","href":"/no-code/customize/fields/relationship","docId":"no-code/customize/fields/relationship"}],"href":"/no-code/customize/fields/"},{"type":"category","label":"Calculate Field Values with Formulas","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Formula Overview","href":"/no-code/customize/formula/overview","docId":"no-code/customize/formula/overview"},{"type":"link","label":"Formula Field Types","href":"/no-code/customize/formula/formula-field","docId":"no-code/customize/formula/formula-field"},{"type":"link","label":"Formula Functions","href":"/no-code/customize/formula/functions","docId":"no-code/customize/formula/functions"},{"type":"link","label":"Cross-Object Formula","href":"/no-code/customize/formula/cross-object","docId":"no-code/customize/formula/cross-object"},{"type":"link","label":"Using Date/Time Values","href":"/no-code/customize/formula/datetime","docId":"no-code/customize/formula/datetime"}],"href":"/no-code/customize/formula/"},{"type":"link","label":"Object Relationships","href":"/no-code/customize/object-relationship","docId":"no-code/customize/object-relationship"},{"type":"link","label":"Custom Button","href":"/no-code/customize/button","docId":"no-code/customize/button"},{"type":"link","label":"External Data Sources","href":"/no-code/customize/external-datasources","docId":"no-code/customize/external-datasources"},{"type":"link","label":"List Views","href":"/no-code/customize/listview","docId":"no-code/customize/listview"},{"type":"link","label":"Page Layouts","href":"/no-code/customize/page-layout","docId":"no-code/customize/page-layout"},{"type":"link","label":"Validation Rules","href":"/no-code/customize/validation-rules","docId":"no-code/customize/validation-rules"}],"href":"/no-code/customize/"},{"type":"category","collapsed":false,"label":"Automate Your Processes","items":[{"type":"link","label":"Automated Actions","href":"/automation/automated-actions","docId":"automation/automated-actions"},{"type":"link","label":"Workflow Rules","href":"/automation/workflow-rules","docId":"automation/workflow-rules"},{"type":"link","label":"Approval Processes","href":"/automation/approval-process","docId":"automation/approval-process"},{"type":"category","label":"Approval King","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Admin Guide","href":"/automation/approval-king/admin-guide","docId":"automation/approval-king/admin-guide"},{"type":"link","label":"Users Started","href":"/automation/approval-king/getting-started","docId":"automation/approval-king/getting-started"}],"href":"/automation/approval-king/"}],"collapsible":true,"href":"/automation"},{"type":"category","label":"Setup Your Organization","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Company Info","href":"/admin/organization/company-info","docId":"admin/organization/company-info"},{"type":"link","label":"Manage Users","href":"/admin/organization/users","docId":"admin/organization/users"},{"type":"link","label":"Manage Departments","href":"/admin/organization/organizations","docId":"admin/organization/organizations"},{"type":"link","label":"Installed Packages","href":"/admin/organization/installed-packages","docId":"admin/organization/installed-packages"},{"type":"link","label":"Import Data","href":"/admin/organization/import","docId":"admin/organization/import"},{"type":"link","label":"Audit logs","href":"/admin/organization/audit-logs","docId":"admin/organization/audit-logs"},{"type":"link","label":"White Label","href":"/admin/organization/white-label","docId":"admin/organization/white-label"}],"href":"/admin/organization/"},{"type":"category","label":"Manage Data Access","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Control Who Sees What","href":"/admin/permissions/overview","docId":"admin/permissions/overview"},{"type":"link","label":"Profiles","href":"/admin/permissions/profile","docId":"admin/permissions/profile"},{"type":"link","label":"Permission Sets","href":"/admin/permissions/permission-set","docId":"admin/permissions/permission-set"},{"type":"link","label":"Object Permissions","href":"/admin/permissions/object-permissions","docId":"admin/permissions/object-permissions"},{"type":"link","label":"Field Permissions","href":"/admin/permissions/field-permissions","docId":"admin/permissions/field-permissions"},{"type":"link","label":"Application Permissions","href":"/admin/permissions/app-permissions","docId":"admin/permissions/app-permissions"},{"type":"link","label":"Divisions","href":"/admin/permissions/division","docId":"admin/permissions/division"},{"type":"link","label":"Restriction Rules","href":"/admin/permissions/restriction-rules","docId":"admin/permissions/restriction-rules"},{"type":"link","label":"Sharing Rules","href":"/admin/permissions/sharing-rules","docId":"admin/permissions/sharing-rules"},{"type":"link","label":"Trigger managed permissions","href":"/admin/permissions/before-find","docId":"admin/permissions/before-find"}],"href":"/admin/permissions/"},{"type":"category","collapsed":false,"label":"Plugins","items":[{"type":"link","label":"DingTalk","href":"/plugins/integration-ding","docId":"plugins/integration-ding"},{"type":"link","label":"WeChat Work","href":"/plugins/integration-qywx","docId":"plugins/integration-qywx"}],"collapsible":true,"href":"/plugins"}],"developer":[{"type":"category","label":"Getting Started","collapsed":false,"items":[{"type":"link","label":"What is Steedos DX?","href":"/developer","docId":"developer"}],"collapsible":true},{"type":"category","label":"Setup Project","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Overview","href":"/developer/setup/overview","docId":"developer/setup/overview"},{"type":"link","label":"Sample Project on GitHub","href":"/developer/setup/sample-repository","docId":"developer/setup/sample-repository"},{"type":"link","label":"Create a New Project","href":"/developer/setup/create-steedos-app","docId":"developer/setup/create-steedos-app"},{"type":"link","label":"Install Steedos Cli","href":"/developer/setup/steedos-cli","docId":"developer/setup/steedos-cli"},{"type":"link","label":"Run Project","href":"/developer/setup/project-start","docId":"developer/setup/project-start"}],"href":"/developer/setup/"},{"type":"category","label":"Package Development","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Overview","href":"/developer/package/overview","docId":"developer/package/overview"},{"type":"category","label":"Metadata","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Automation Metadata","href":"/developer/package/metadata/metadata-automation","docId":"developer/package/metadata/metadata-automation"},{"type":"link","label":"Object Metadata","href":"/developer/package/metadata/metadata-object","docId":"developer/package/metadata/metadata-object"},{"type":"link","label":"Permission Metadata","href":"/developer/package/metadata/metadata-permissions","docId":"developer/package/metadata/metadata-permissions"},{"type":"link","label":"UI Metadata","href":"/developer/package/metadata/metadata-ui","docId":"developer/package/metadata/metadata-ui"}],"href":"/developer/package/metadata/"},{"type":"link","label":"Synchronize Metadata","href":"/developer/package/sync-metadata","docId":"developer/package/sync-metadata"},{"type":"link","label":"Package Installation","href":"/developer/package/package-install","docId":"developer/package/package-install"},{"type":"link","label":"Package Publishing","href":"/developer/package/package-publish","docId":"developer/package/package-publish"}],"href":"/developer/package/"},{"type":"category","label":"Service Development","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Overview","href":"/developer/service/overview","docId":"developer/service/overview"},{"type":"link","label":"Package Service","href":"/developer/service/package-service","docId":"developer/service/package-service"},{"type":"link","label":"REST API","href":"/developer/service/action-api","docId":"developer/service/action-api"},{"type":"link","label":"Triggers","href":"/developer/service/action-trigger","docId":"developer/service/action-trigger"},{"type":"link","label":"ObjectQL","href":"/developer/service/objectql","docId":"developer/service/objectql"},{"type":"link","label":"Internationalization","href":"/developer/service/locale","docId":"developer/service/locale"},{"type":"category","label":"Moleculer Microservices Framework","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Actions","href":"/developer/service/moleculer/actions","docId":"developer/service/moleculer/actions"},{"type":"link","label":"Events","href":"/developer/service/moleculer/events","docId":"developer/service/moleculer/events"},{"type":"link","label":"REPL Console","href":"/developer/service/moleculer/repl","docId":"developer/service/moleculer/repl"}],"href":"/developer/service/moleculer/"},{"type":"category","label":"Platform Service Reference","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"GraphQL","href":"/developer/service/service-api/service-graphql","docId":"developer/service/service-api/service-graphql"},{"type":"link","label":"Push Notification","href":"/developer/service/service-api/service-push","docId":"developer/service/service-api/service-push"},{"type":"link","label":"SMS Notification","href":"/developer/service/service-api/service-sms","docId":"developer/service/service-api/service-sms"}],"href":"/developer/service/service-api/"}],"href":"/developer/service/"},{"type":"category","label":"Micro Page Builder","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Overview","href":"/developer/micro-page/overview","docId":"developer/micro-page/overview"},{"type":"link","label":"Quick Start","href":"/developer/micro-page/getting_start","docId":"developer/micro-page/getting_start"},{"type":"category","label":"AMIS Low-Code Framework","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuration and Components","href":"/developer/micro-page/amis/base_config","docId":"developer/micro-page/amis/base_config"},{"type":"link","label":"Data Scope and Data Chain","href":"/developer/micro-page/amis/data","docId":"developer/micro-page/amis/data"},{"type":"link","label":"Template Rendering","href":"/developer/micro-page/amis/tpl","docId":"developer/micro-page/amis/tpl"},{"type":"link","label":"Data Mapping","href":"/developer/micro-page/amis/data_mapping","docId":"developer/micro-page/amis/data_mapping"},{"type":"link","label":"Expressions","href":"/developer/micro-page/amis/expression","docId":"developer/micro-page/amis/expression"},{"type":"link","label":"Linkage Mechanism","href":"/developer/micro-page/amis/linkage","docId":"developer/micro-page/amis/linkage"},{"type":"link","label":"Event Actions","href":"/developer/micro-page/amis/event","docId":"developer/micro-page/amis/event"},{"type":"link","label":"Custom Styles","href":"/developer/micro-page/amis/styles","docId":"developer/micro-page/amis/styles"}],"href":"/developer/micro-page/amis/"},{"type":"link","label":"Custom Components","href":"/developer/micro-page/custom_components","docId":"developer/micro-page/custom_components"},{"type":"category","label":"Components Reference","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ObjectForm","href":"/developer/micro-page/components/object_form","docId":"developer/micro-page/components/object_form"},{"type":"link","label":"ObjectListView","href":"/developer/micro-page/components/object_listview","docId":"developer/micro-page/components/object_listview"},{"type":"link","label":"ObjectTable","href":"/developer/micro-page/components/object_table","docId":"developer/micro-page/components/object_table"},{"type":"link","label":"RecordDetailHeader","href":"/developer/micro-page/components/record_detail_header","docId":"developer/micro-page/components/record_detail_header"},{"type":"link","label":"RecordDetailRelatedList","href":"/developer/micro-page/components/record_detail_related_list","docId":"developer/micro-page/components/record_detail_related_list"}],"href":"/developer/micro-page/components/"}],"href":"/developer/micro-page/"},{"type":"category","label":"Steedos API","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Overview","href":"/developer/api/overview","docId":"developer/api/overview"},{"type":"link","label":"API Authentication","href":"/developer/api/api-validate","docId":"developer/api/api-validate"},{"type":"link","label":"GraphQL API","href":"/developer/api/graphql-api","docId":"developer/api/graphql-api"},{"type":"link","label":"OpenAPI","href":"/developer/api/openapi","docId":"developer/api/openapi"},{"type":"link","label":"Process API","href":"/developer/api/api-process","docId":"developer/api/api-process"}],"href":"/developer/api/"},{"type":"category","label":"Integration","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"SSO API","href":"/developer/integration/api-jwt-sso","docId":"developer/integration/api-jwt-sso"},{"type":"link","label":"Node-Red","href":"/developer/integration/node-red","docId":"developer/integration/node-red"}],"href":"/developer/integration/"},{"type":"category","collapsed":false,"label":"Product","items":[{"type":"link","label":"Release Notes","href":"https://github.com/orgs/steedos/projects/9"},{"type":"link","label":"Contribute","href":"https://github.com/steedos/steedos-platform/blob/master/CONTRIBUTING.md"}],"collapsible":true}],"apps":[{"type":"category","label":"Getting Started","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"What is Low-code App?","href":"/apps/getting-started/overview","docId":"apps/getting-started/overview"},{"type":"link","label":"Self Hosting","href":"/apps/getting-started/deploy","docId":"apps/getting-started/deploy"}]},{"type":"category","label":"Spend Management","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Project Cost Management","href":"/apps/spend-management/project/","docId":"apps/spend-management/project/README"},{"type":"link","label":"Contract","href":"/apps/spend-management/contract/","docId":"apps/spend-management/contract/README"},{"type":"link","label":"Expense","href":"/apps/spend-management/expense/","docId":"apps/spend-management/expense/README"},{"type":"link","label":"Invoice Management","href":"/apps/spend-management/invoice/","docId":"apps/spend-management/invoice/README"},{"type":"link","label":"Supplier","href":"/apps/spend-management/supplier/","docId":"apps/spend-management/supplier/README"},{"type":"link","label":"Tender Management","href":"/apps/spend-management/tender/","docId":"apps/spend-management/tender/README"}],"href":"/apps/spend-management/"},{"type":"category","label":"Human Capital Management","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Employee Management","href":"/apps/human-capital-management/employee/","docId":"apps/human-capital-management/employee/README"},{"type":"link","label":"Attendance","href":"/apps/human-capital-management/attendance/","docId":"apps/human-capital-management/attendance/README"},{"type":"link","label":"Performance Evaluation","href":"/apps/human-capital-management/performance/","docId":"apps/human-capital-management/performance/README"}],"href":"/apps/human-capital-management/"},{"type":"category","label":"Customer Relationship Management","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Sales","href":"/apps/customer-relationship-management/sales/","docId":"apps/customer-relationship-management/sales/README"},{"type":"link","label":"Service","href":"/apps/customer-relationship-management/service/","docId":"apps/customer-relationship-management/service/README"}],"href":"/apps/customer-relationship-management/"},{"type":"category","label":"Collaboration Tools","collapsible":true,"collapsed":false,"items":[{"type":"link","label":"Approval King","href":"/apps/collaboration/approval-king/","docId":"apps/collaboration/approval-king/README"},{"type":"link","label":"Milestone","href":"/apps/collaboration/milestone/","docId":"apps/collaboration/milestone/README"}],"href":"/apps/collaboration/"}]},"docs":{"admin":{"id":"admin","title":"Set Up and Maintain Your Steedos Organization","description":"As a Steedos administrator\u2014that is, a user assigned to the Administrator profile\u2014you\u2019re responsible for setting up your steedos organization, which means adding users and configuring the system for your needs."},"admin/organization/audit-logs":{"id":"admin/organization/audit-logs","title":"Audit logs","description":"The audit log is the report of all the activities done in your Steedos account. It will capture and display events automatically by recording who performed an activity, what when, and where the activity was performed, along with other information such as IP address.","sidebar":"platform"},"admin/organization/company-info":{"id":"admin/organization/company-info","title":"Company Info","description":"Use the Company Information page in Setup to track what\u2019s important about your company\u2019s organization in Steedos. This page contains the information that was provided when your company signed up with Steedos.","sidebar":"platform"},"admin/organization/import":{"id":"admin/organization/import","title":"Import Data Into Steedos","description":"Steedos offers several ways to import your data. You can import up to 50,000 records into Steedos.","sidebar":"platform"},"admin/organization/installed-packages":{"id":"admin/organization/installed-packages","title":"Installed Packages","description":"You can install packages into your Steedos organization, and then configure and manage them. To view the packages you\u2019ve installed, from Setup, select Installed Packages.","sidebar":"platform"},"admin/organization/organizations":{"id":"admin/organization/organizations","title":"Manage Departments","description":"The Department Management feature allows you to easily manage and organize departments within your organization. With this feature, you can create, edit, and delete departments as well as assign employees to specific departments.","sidebar":"platform"},"admin/organization/README":{"id":"admin/organization/README","title":"Setup Your Organization","description":"","sidebar":"platform"},"admin/organization/users":{"id":"admin/organization/users","title":"Manage Users","description":"In Steedos, each user is uniquely identified with a username, password, and profile. Together with other settings, the profile determines which tasks a user can perform, what data the user can see, and what the user can do with the data.","sidebar":"platform"},"admin/organization/white-label":{"id":"admin/organization/white-label","title":"White Label","description":"White Label feature will allow you to remove the Steedos branding from the Steedos platform and add your own custom logo and text.","sidebar":"platform"},"admin/permissions/app-permissions":{"id":"admin/permissions/app-permissions","title":"Application Permissions","description":"Steedos supports application authorization based on permission sets, which can be used to restrict users under a certain permission set/profile to only see certain applications.","sidebar":"platform"},"admin/permissions/before-find":{"id":"admin/permissions/before-find","title":"Trigger managed permissions","description":"While Steedos provides various built-in solutions to easily achieve precise field and record level permission control as described above, some permission requirements in unique project scenarios may not be met by these methods alone. Therefore, the Steedos permission engine also incorporates beforeFind triggers, which allow personalized and more advanced permission issues to be addressed through code.","sidebar":"platform"},"admin/permissions/division":{"id":"admin/permissions/division","title":"Organize Data with Divisions","description":"Divisions let you segment your organization\'s data into logical sections, making searches, reports, and list views more meaningful to users. Divisions are useful for organizations with extremely large amounts of data.","sidebar":"platform"},"admin/permissions/field-permissions":{"id":"admin/permissions/field-permissions","title":"Field Permissions","description":"Field permissions specify the access level for each field in an object.","sidebar":"platform"},"admin/permissions/index":{"id":"admin/permissions/index","title":"Manage Data Access","description":"Steedos provides a flexible, layered data sharing design that lets admins control user access to data. Managing data access enhances security by exposing only data that\u2019s relevant to users. Use permission sets, permission set groups, and profiles to control the objects and fields users can access. Use sharing rules to specify the individual records that users can view and edit.","sidebar":"platform"},"admin/permissions/object-permissions":{"id":"admin/permissions/object-permissions","title":"Object Permissions","description":"Object permissions specify the base-level access users have to create, read, edit, and delete records for each object. You can manage object permissions in permission sets and profiles.","sidebar":"platform"},"admin/permissions/overview":{"id":"admin/permissions/overview","title":"Control Who Sees What","description":"Steedos data sharing lets you expose specific data sets to individuals and groups of users. Permission sets, permission set groups, and profiles provide object-level and field-level security by controlling access. Record-level sharing settings, user roles, and sharing rules control the individual records that users can view and edit.","sidebar":"platform"},"admin/permissions/permission-set":{"id":"admin/permissions/permission-set","title":"Permission Sets","description":"A permission set is a collection of settings and permissions that give users access to various tools and functions. Permission sets extend users\u2019 functional access without changing their profiles and are the recommended way to manage your users\u2019 permissions.","sidebar":"platform"},"admin/permissions/profile":{"id":"admin/permissions/profile","title":"Profiles","description":"Profiles define how users access objects and data, and what they can do within the application. When you create users, you assign a profile to each one.","sidebar":"platform"},"admin/permissions/restriction-rules":{"id":"admin/permissions/restriction-rules","title":"Restriction Rules","description":"Restriction rules let you enhance your security by allowing certain users to access only specified records. They prevent users from accessing records that can contain sensitive data or information that isn\u2019t essential to their work. Restriction rules filter the records that a user has access to so that they can access only the records that match the criteria you specify.","sidebar":"platform"},"admin/permissions/sharing-rules":{"id":"admin/permissions/sharing-rules","title":"Sharing Rules","description":"Use sharing rules to extend sharing access to users in public groups, roles, or territories. Sharing rules give particular users greater access by making automatic exceptions to your org-wide sharing settings.","sidebar":"platform"},"apps/collaboration/approval-king/README":{"id":"apps/collaboration/approval-king/README","title":"Approval King: Streamlining Your Approval Processes","description":"Approval King is an innovative process automation solution designed to streamline and simplify the approval workflows within an organization. By leveraging cutting-edge technology, Approval King transforms traditional, cumbersome approval processes into a seamless, efficient, and transparent system. It empowers organizations to manage approvals with ease, ensuring compliance, enhancing productivity, and accelerating decision-making.","sidebar":"apps"},"apps/collaboration/milestone/README":{"id":"apps/collaboration/milestone/README","title":"Steedos Milestone: Project Task Management System","description":"The Steedos Project Task Management System is an application developed on the Steedos low-code platform, designed to help businesses efficiently plan, track, and manage project tasks. With its flexible customization features, it meets the project management needs of different enterprises, enhancing team collaboration efficiency and ensuring projects are completed on time and to quality standards.","sidebar":"apps"},"apps/collaboration/README":{"id":"apps/collaboration/README","title":"Collaboration Tools","description":"Enterprise Collaboration System (ECS) are comprehensive information systems designed to support communication, collaboration, and information sharing among employees within an organization. These systems typically offer a range of tools and features to support team collaboration, project management, document sharing, instant messaging, and other work-related activities.","sidebar":"apps"},"apps/customer-relationship-management/README":{"id":"apps/customer-relationship-management/README","title":"Customer Relationship Management","description":"Customer Relationship Management (CRM) is a combination of strategies and technologies used by companies to manage and analyze customer interactions and data throughout the customer lifecycle. The primary goal of CRM is to improve business relationships with customers, assist in customer retention, and drive sales growth. A CRM system helps companies stay connected to customers, streamline processes, and improve profitability.","sidebar":"apps"},"apps/customer-relationship-management/sales/README":{"id":"apps/customer-relationship-management/sales/README","title":"Steedos Sales Management System","description":"In the competitive landscape of sales, efficiency and customer relationship are key. The Steedos Sales Management System, is designed to empower sales teams with the tools they need for success. Built on the Steedos low-code platform, this system offers a highly customizable and user-friendly experience.","sidebar":"apps"},"apps/customer-relationship-management/service/README":{"id":"apps/customer-relationship-management/service/README","title":"Steedos Service Management System","description":"In today\'s rapidly changing business environment, delivering exceptional customer service is key to success. Steedos Service Management System is designed to provide businesses with a comprehensive service management solution. Built on the Steedos low-code platform, this system offers a highly customizable and user-friendly experience.","sidebar":"apps"},"apps/getting-started/deploy":{"id":"apps/getting-started/deploy","title":"Self Hosting","description":"Follow these steps to deploy Steedos Apps on Docker.","sidebar":"apps"},"apps/getting-started/overview":{"id":"apps/getting-started/overview","title":"What is Low-code App?","description":"In traditional enterprise application development, every feature and module required coding from scratch. This not only consumed a significant amount of time but also incurred high development costs. Moreover, when business requirements changed, modifying and optimizing the application became complex and challenging.","sidebar":"apps"},"apps/human-capital-management/attendance/README":{"id":"apps/human-capital-management/attendance/README","title":"Attendance Management","description":"Steedos Attendance Management System is an efficient and modern attendance management software, designed specifically to meet the attendance management needs of various enterprises. Developed on the Steedos low-code platform, the system not only inherits the platform\'s flexibility and high customizability but also supports private deployment, ensuring absolute security and privacy of enterprise data.","sidebar":"apps"},"apps/human-capital-management/employee/README":{"id":"apps/human-capital-management/employee/README","title":"Employee Lifecycle Management System","description":"In modern enterprise management, the Employee Lifecycle Management System (ELMS) plays a crucial role. It not only enhances the efficiency of human resource management but also strengthens employees\' sense of belonging and satisfaction. Based on the Steedos low-code platform, we have designed a comprehensive employee lifecycle management system aimed at simplifying and optimizing every stage from onboarding to offboarding.","sidebar":"apps"},"apps/human-capital-management/performance/README":{"id":"apps/human-capital-management/performance/README","title":"Steedos Performance Evaluation System","description":"In the modern corporate landscape, ensuring the continuous growth of a company and the professional development of its employees is paramount. Performance evaluation plays a crucial role in this process. With the Steedos low-code platform, we present a comprehensive solution for performance evaluation, ensuring that each employee\'s performance is assessed fairly and accurately.","sidebar":"apps"},"apps/human-capital-management/README":{"id":"apps/human-capital-management/README","title":"Human Capital Management","description":"HCM, standing for Human Capital Management, is an integrated approach that covers the entire lifecycle of an employee within an organization. It encompasses activities related to recruiting, onboarding, training, performance management, compensation, benefits, and offboarding.","sidebar":"apps"},"apps/spend-management/contract/README":{"id":"apps/spend-management/contract/README","title":"Steedos Contract Lifecycle Management System","description":"In the modern business landscape, contract management is paramount, impacting a company\'s profits, compliance, and risk management. Leveraging the Steedos low-code platform, we offer a comprehensive solution for managing the entire lifecycle of a contract, ensuring every phase is efficiently handled.","sidebar":"apps"},"apps/spend-management/expense/README":{"id":"apps/spend-management/expense/README","title":"Steedos Expense: Smart, Efficient, One-stop Reimbursement Experience","description":"In daily corporate operations, reimbursement management is often a tedious part of financial tasks. Steedos Expense Solution, based on Steedos\' low-code platform, builds a comprehensive, intelligent reimbursement process management system for you, focusing on providing an efficient, standardized reimbursement experience for enterprises.","sidebar":"apps"},"apps/spend-management/invoice/README":{"id":"apps/spend-management/invoice/README","title":"Steedos Invoice Management System","description":"In modern enterprise management, invoice processing is a key financial process. The Steedos Invoice Management System is a solution developed on a low-code platform, designed to simplify and automate the invoice processing workflow, increase efficiency, reduce errors, and ensure financial compliance.","sidebar":"apps"},"apps/spend-management/project/README":{"id":"apps/spend-management/project/README","title":"Project Cost Management System","description":"The Project Cost Management System is an application developed on the Steedos low-code platform, designed to help businesses effectively track and manage project costs. This system offers a comprehensive set of tools for monitoring project budgets, actual expenditures, labor costs, travel expenses, etc., ensuring that project costs are kept within budget, thereby enhancing project profitability and management efficiency.","sidebar":"apps"},"apps/spend-management/README":{"id":"apps/spend-management/README","title":"Spend Management","description":"Spend Management refers to the process by which enterprises manage and control all their expenditures, including direct expenses (such as raw materials and production costs) and indirect expenses (such as office supplies, travel, and entertainment costs). The goal of spend management is to reduce costs and improve the financial performance of the enterprise by optimizing procurement processes, negotiating more favorable supplier contracts, implementing cost control measures, and more.","sidebar":"apps"},"apps/spend-management/supplier/README":{"id":"apps/spend-management/supplier/README","title":"Steedos Supplier Management System","description":"In today\'s globalized business environment, selecting the right suppliers and maintaining good supplier relationships is crucial. The Steedos Supplier Management System offers businesses a centralized solution to systematically manage supplier information, evaluate their qualifications, and optimize interactions with them.","sidebar":"apps"},"apps/spend-management/tender/README":{"id":"apps/spend-management/tender/README","title":"Steedos Tender Management System","description":"The Steedos Tender Management System, developed on the Steedos low-code platform, is a highly customizable solution designed to streamline the tendering process for businesses and government agencies. It aims to simplify the tendering workflow, enhance efficiency and transparency, and ensure fairness and compliance in tendering activities.","sidebar":"apps"},"automation":{"id":"automation","title":"Automate Your Business Processes","description":"Instead of relying on your users to perform each part of a business process, automate it! The benefits are two-fold behind-the-scenes automation, and approval automation. You\'ll be happy to know that these tools don\'t require you to write code\u2014they\'re all point-and-click.","sidebar":"platform"},"automation/approval-king/admin-guide":{"id":"automation/approval-king/admin-guide","title":"Admin Guide","description":"Form design","sidebar":"platform"},"automation/approval-king/getting-started":{"id":"automation/approval-king/getting-started","title":"Users Started","description":"Upon logging into the system, you can access the \\"Process\\" module, where you can initiate, approve, and inquire about application forms.","sidebar":"platform"},"automation/approval-king/index":{"id":"automation/approval-king/index","title":"Approval King","description":"Deploy quickly, monitor effectively, and continuously optimize various business processes.","sidebar":"platform"},"automation/approval-process":{"id":"automation/approval-process","title":"Approval Processes","description":"It\u2019s likely that you\u2019re familiar with process automation in the form of workflow rules. Approval processes take automation one step further, letting you specify a sequence of steps that are required to approve a record.","sidebar":"platform"},"automation/automated-actions":{"id":"automation/automated-actions","title":"Automated Actions","description":"An automated action is a reusable component that performs some sort of action behind the scenes\u2014like updating a field or sending an email. After you create an automated action, add it to a process, milestone, or other automated process.","sidebar":"platform"},"automation/workflow-rules":{"id":"automation/workflow-rules","title":"Workflow Rules","description":"Workflow rules let you automate standard internal procedures and processes to save time across your org. A workflow rule is the main container for a set of workflow instructions. These instructions can always be summed up in an if/then statement.","sidebar":"platform"},"deploy":{"id":"deploy","title":"Self Hosting","description":"","sidebar":"platform"},"deploy/deploy-docker":{"id":"deploy/deploy-docker","title":"Steedos Docker Deployment Guide","description":"This document will guide you on how to deploy the Steedos platform on your server using Docker.","sidebar":"platform"},"deploy/gitpod":{"id":"deploy/gitpod","title":"Try with Gitpod","description":"Gitpod is an online Integrated Development Environment (IDE) which is used for software development. It\'s a cloud-based service that allows developers to work on their projects directly from their web browser. This service provides a complete dev environment for every Git project, including pull requests and branches.","sidebar":"platform"},"deploy/intranet":{"id":"deploy/intranet","title":"Intranet","description":"Follow the steps below to deploy Steedos in an Ubuntu 20.04 intranet environment.","sidebar":"platform"},"deploy/steedos-config":{"id":"deploy/steedos-config","title":"Instance Configuration","description":"This page provides instructions on how to configure your self-hosted Steedos instance.","sidebar":"platform"},"developer":{"id":"developer","title":"What is Steedos DX?","description":"Steedos Developer Experience (DX) is a new way of managing and developing applications on the Steedos low-code platform throughout their entire lifecycle. It combines the best features of a low-code platform, achieving source-driven development, team collaboration with governance, and a new level of custom app development on Steedos.","sidebar":"developer"},"developer/api/api-process":{"id":"developer/api/api-process","title":"Process API","description":"\u6839\u636e\u6d41\u7a0b\u7684\u5143\u6570\u636e\u5b9a\u4e49\uff0c\u81ea\u52a8\u751f\u6210\u5ba1\u6279\u76f8\u5173API\u3002","sidebar":"developer"},"developer/api/api-validate":{"id":"developer/api/api-validate","title":"API Authentication","description":"Before calling an api, api authentication must be performed first. Steedos supports multiple ways to authenticate apis, making api calls easy and flexible. Moreover, it can also achieve functions such as single sign-on, validating login status, and logging out, making interface calls even more flexible and convenient.","sidebar":"developer"},"developer/api/graphql-api":{"id":"developer/api/graphql-api","title":"GraphQL API","description":"GraphQL Console","sidebar":"developer"},"developer/api/openapi":{"id":"developer/api/openapi","title":"OpenAPI","description":"- OpenAPI API Documentation","sidebar":"developer"},"developer/api/overview":{"id":"developer/api/overview","title":"Overview","description":"Steedos provides a comprehensive suite of robust APIs, allowing a plethora of opportunities for enterprise integration, development, and functionality enhancement.","sidebar":"developer"},"developer/api/README":{"id":"developer/api/README","title":"API Guide","description":"Steedos, recognized as a trailblazer in low-code development platform, also provides a comprehensive suite of robust APIs, allowing a plethora of opportunities for enterprise integration, development, and functionality enhancement.","sidebar":"developer"},"developer/integration/api-jwt-sso":{"id":"developer/integration/api-jwt-sso","title":"SSO API","description":"\u901a\u8fc7jwt\u5b9e\u73b0\u5916\u63a5\u5e94\u7528\u4e0e\u9b54\u65b9\u5e73\u53f0\u53cc\u5411\u5355\u70b9\u767b\u5f55\u3002","sidebar":"developer"},"developer/integration/node-red":{"id":"developer/integration/node-red","title":"Node-Red","description":"Node-RED is a process-oriented programming tool that allows you to effortlessly connect IoT devices, APIs and online services together. It employs a browser-based editor which allows users to drag and drop different nodes onto a canvas, and connect them to create a flow. Node-RED also offers a plethora of nodes which enable users to easily interact with a diverse range of devices and services.https://Node-Red.org/\u3002","sidebar":"developer"},"developer/integration/README":{"id":"developer/integration/README","title":"Extend the Reach of Your Organization","description":"Sometimes your users need to work with data and services that are outside your Steedos org. There\u2019s a variety of ways you can provide seamless access across org boundaries.","sidebar":"developer"},"developer/micro-page/amis/base_config":{"id":"developer/micro-page/amis/base_config","title":"Configuration and Components","description":"Welcome to the AMIS documentation. In this section, we will delve into the core concept of schema, which is the key element for defining the structure and behavior of components in AMIS.","sidebar":"developer"},"developer/micro-page/amis/data":{"id":"developer/micro-page/amis/data","title":"Data Scope and Data Chain","description":"Basic Concepts: Data Scope and Data Chain","sidebar":"developer"},"developer/micro-page/amis/data_mapping":{"id":"developer/micro-page/amis/data_mapping","title":"Data Mapping","description":"Data mapping is a powerful feature that allows users to fetch variable values from the current data chain by using template strings, such as $ or $xxx. This method is mainly used in scenarios like template strings, customizing API request body formats, etc.","sidebar":"developer"},"developer/micro-page/amis/event":{"id":"developer/micro-page/amis/event","title":"Event Actions","description":"In AMIS, events and actions are key to implementing complex UI interactions. They allow developers to listen for component events and respond with corresponding actions without worrying about component hierarchy. The capabilities of events and actions include, but are not limited to:","sidebar":"developer"},"developer/micro-page/amis/expression":{"id":"developer/micro-page/amis/expression","title":"Expressions","description":"In AMIS, expressions are a powerful tool that allows users to dynamically handle data in various scenarios. Expressions can be used for template variable retrieval, API endpoint parameter retrieval, data mapping, conditions for component visibility, form default values, and more. AMIS supports two syntaxes for expressions: pure JavaScript expressions and expressions wrapped in ${}.","sidebar":"developer"},"developer/micro-page/amis/linkage":{"id":"developer/micro-page/amis/linkage","title":"Linkage Mechanism","description":"In AMIS, the linkage mechanism is an important feature for achieving dynamic page interactions. Through linkage, components can be controlled to show, hide, or disable based on certain conditions, or to trigger interface requests. Linkage configurations are usually based on expressions.","sidebar":"developer"},"developer/micro-page/amis/README":{"id":"developer/micro-page/amis/README","title":"AMIS Frontend Low-Code Framework","description":"Introduction to AMIS","sidebar":"developer"},"developer/micro-page/amis/styles":{"id":"developer/micro-page/amis/styles","title":"Custom Styles","description":"In many components, there is a className property. By setting the component\'s className, you can change its style.","sidebar":"developer"},"developer/micro-page/amis/tpl":{"id":"developer/micro-page/amis/tpl","title":"Template Rendering","description":"Welcome to the AMIS documentation. In this section, we will explore the template rendering feature in AMIS, which is a function borrowed from other template engines, aimed at providing flexibility in rendering text and data structures.","sidebar":"developer"},"developer/micro-page/components/object_form":{"id":"developer/micro-page/components/object_form","title":"ObjectForm","description":"Steedos\u5fae\u9875\u9762\u5f15\u64ce\uff0c\u5185\u7f6e\u5bf9\u8c61\u8868\u5355\u7ec4\u4ef6 ObjectForm\uff0c\u501f\u52a9amis\u6e32\u67d3\u5668\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u5feb\u901f\u751f\u6210\u4e00\u4e2a\u529f\u80fd\u5b8c\u5584\u7684\u5bf9\u8c61\u8868\u5355\u7ec4\u4ef6\u3002","sidebar":"developer"},"developer/micro-page/components/object_listview":{"id":"developer/micro-page/components/object_listview","title":"ObjectListView","description":"Steedos\u5fae\u9875\u9762\u5f15\u64ce\uff0c\u5185\u7f6e\u5217\u8868\u89c6\u56fe\u7ec4\u4ef6 ObjectListView\uff0c\u501f\u52a9amis\u6e32\u67d3\u5668\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u5feb\u901f\u751f\u6210\u4e00\u4e2a\u529f\u80fd\u5b8c\u5584\u7684\u5217\u8868\u89c6\u56fe\u7ec4\u4ef6\u3002","sidebar":"developer"},"developer/micro-page/components/object_table":{"id":"developer/micro-page/components/object_table","title":"ObjectTable","description":"This is an object table component based on the Steedos object, which displays object records as a table while including functionalities for CRUD and other operation buttons. The main difference with the Object List component is that this component allows for configuration of the table\'s displayed columns, filtering conditions, and other basic properties.","sidebar":"developer"},"developer/micro-page/components/README":{"id":"developer/micro-page/components/README","title":"Components Reference","description":"Amis native components","sidebar":"developer"},"developer/micro-page/components/record_detail_header":{"id":"developer/micro-page/components/record_detail_header","title":"RecordDetailHeader","description":"Steedos\u5fae\u9875\u9762\u5f15\u64ce\uff0c\u5185\u7f6e\u6807\u9898\u9762\u677f\u7ec4\u4ef6 RecordDetailHeader\uff0c\u501f\u52a9amis\u6e32\u67d3\u5668\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u5feb\u901f\u751f\u6210\u4e00\u4e2a\u529f\u80fd\u5b8c\u5584\u7684\u6807\u9898\u9762\u677f\u7ec4\u4ef6\u3002","sidebar":"developer"},"developer/micro-page/components/record_detail_related_list":{"id":"developer/micro-page/components/record_detail_related_list","title":"RecordDetailRelatedList","description":"Steedos\u5fae\u9875\u9762\u5f15\u64ce\uff0c\u5185\u7f6e\u76f8\u5173\u8868\u7ec4\u4ef6 RecordDetailRelatedList\uff0c\u501f\u52a9amis\u6e32\u67d3\u5668\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u4eba\u5458\u5feb\u901f\u751f\u6210\u4e00\u4e2a\u529f\u80fd\u5b8c\u5584\u7684\u76f8\u5173\u8868\u89c6\u56fe\u7ec4\u4ef6\u3002","sidebar":"developer"},"developer/micro-page/custom_components":{"id":"developer/micro-page/custom_components","title":"Custom Components","description":"Introduction","sidebar":"developer"},"developer/micro-page/getting_start":{"id":"developer/micro-page/getting_start","title":"Quick Start","description":"In this section, we will introduce how to build a simple micro page (taking an application micro page as an example) and explain how to view the current data of components.","sidebar":"developer"},"developer/micro-page/overview":{"id":"developer/micro-page/overview","title":"Overview","description":"We are proud to introduce the Steedos Micro Page Builder, a powerful toolkit for micro page development based on Baidu AMIS technology. Steedos supports the creation of custom pages and components, equipped with intuitive visual design tools.","sidebar":"developer"},"developer/micro-page/README":{"id":"developer/micro-page/README","title":"Micro Page Builder","description":"Introducing Steedos Micro Page Builder, a powerful micro-page development toolkit rooted in Baidu AMIS technology. Drawing parallels with the renowned Salesforce Lightning Page Builder, this platform facilitates the creation of custom pages and components, made even more accessible with its visual design utilities.","sidebar":"developer"},"developer/package/metadata/metadata-automation":{"id":"developer/package/metadata/metadata-automation","title":"Automation Metadata","description":"Overview","sidebar":"developer"},"developer/package/metadata/metadata-object":{"id":"developer/package/metadata/metadata-object","title":"Object Metadata","description":"Object .object.yml","sidebar":"developer"},"developer/package/metadata/metadata-permissions":{"id":"developer/package/metadata/metadata-permissions","title":"Permission Metadata","description":"Define metadata related to permissions.","sidebar":"developer"},"developer/package/metadata/metadata-ui":{"id":"developer/package/metadata/metadata-ui","title":"UI Metadata","description":"Overview","sidebar":"developer"},"developer/package/metadata/README":{"id":"developer/package/metadata/README","title":"Metadata","description":"Introduction","sidebar":"developer"},"developer/package/overview":{"id":"developer/package/overview","title":"Overview","description":"If you\u2019re new to packaging, you can think about a package as a container that you fill with metadata. It contains a set of related features, customizations, and schema. You use packages to move metadata from one Steedos deployment to another.","sidebar":"developer"},"developer/package/package-install":{"id":"developer/package/package-install","title":"Package Installation","description":"The Steedos platform can extend its capabilities by installing additional packages. Below is the process for installing Steedos packages from npm repositories or private repositories.","sidebar":"developer"},"developer/package/package-publish":{"id":"developer/package/package-publish","title":"Package Publishing","description":"Overview","sidebar":"developer"},"developer/package/README":{"id":"developer/package/README","title":"Package Development","description":"If you\u2019re new to packaging, you can think about a package as a container that you fill with metadata. It contains a set of related features, customizations, and schema. You use packages to move metadata from one Steedos deployment to another.","sidebar":"developer"},"developer/package/sync-metadata":{"id":"developer/package/sync-metadata","title":"Synchronize Metadata","description":"By using the VS Code plugin, you can synchronize the metadata of visual development with the project source code, achieve version management of metadata, and further utilize DevOps tools for team development and automation.","sidebar":"developer"},"developer/service/action-api":{"id":"developer/service/action-api","title":"REST API","description":"In the event that the standard API generated by the Steedos cannot satisfy the business requirements, you can write a custom API to handle business data on the server.","sidebar":"developer"},"developer/service/action-trigger":{"id":"developer/service/action-trigger","title":"Triggers","description":"By writing triggers, you can automatically trigger a piece of server-side code before and after record creation, deletion, and changes, achieving personalized data validation and processing.","sidebar":"developer"},"developer/service/locale":{"id":"developer/service/locale","title":"Internationalization","description":"Steedos is a low-code platform that supports multiple languages. We can override the default translated content of the system by writing internationalization resource files in the software package, which enables internationalization.","sidebar":"developer"},"developer/service/moleculer/actions":{"id":"developer/service/moleculer/actions","title":"Actions","description":"The actions are the callable/public methods of the service. The action calling represents a remote-procedure-call (RPC). It has request parameters & returns response, like a HTTP request.","sidebar":"developer"},"developer/service/moleculer/events":{"id":"developer/service/moleculer/events","title":"Events","description":"Steedos has a built-in event bus to support Event-driven architecture and to send events to local and remote services.","sidebar":"developer"},"developer/service/moleculer/README":{"id":"developer/service/moleculer/README","title":"Moleculer Microservices Framework","description":"Moleculer is a fast, powerful, and flexible microservices framework. Its core philosophy revolves around building applications by decomposing them into services. Each service is autonomous, allowing for independent deployment, scaling, and maintenance. Moleculer provides a lightweight messaging system, simplifying and optimizing communication between services.","sidebar":"developer"},"developer/service/moleculer/repl":{"id":"developer/service/moleculer/repl","title":"REPL Console","description":"REPL is an interactive developer console for Steedos.","sidebar":"developer"},"developer/service/objectql":{"id":"developer/service/objectql","title":"ObjectQL","description":"ObjectQL is a query language designed for interacting with data objects within the Steedos Platform. Similar in concept to SQL used in relational databases, ObjectQL allows users to perform CRUD operations (Create, Read, Update, Delete) on structured data stored as objects.","sidebar":"developer"},"developer/service/overview":{"id":"developer/service/overview","title":"Overview of Steedos Microservices Architecture","description":"In traditional monolithic applications, all functionalities and components are bundled into one large application. Over time, such an application can become extremely large and intricate, making maintenance, scaling, and deployment challenging. Microservices architecture tackles these challenges by breaking down large applications into small, independent, and interoperable services.","sidebar":"developer"},"developer/service/package-service":{"id":"developer/service/package-service","title":"Package Service","description":"The Steedos Platform is based on the Moleculer microservices architecture, where each package is a Moleculer Service. You can define actions, methods, and subscribe to events in the service.","sidebar":"developer"},"developer/service/README":{"id":"developer/service/README","title":"Service Development","description":"The Steedos Platform is based on the Moleculer microservices architecture, where each package is a Moleculer Service. You can define actions, methods, and subscribe to events in the service.","sidebar":"developer"},"developer/service/service-api/README":{"id":"developer/service/service-api/README","title":"Platform Service Reference","description":"","sidebar":"developer"},"developer/service/service-api/service-graphql":{"id":"developer/service/service-api/service-graphql","title":"GraphQL","description":"You can call the GraphQL microservice to execute GraphQL queries on the server-side.","sidebar":"developer"},"developer/service/service-api/service-push":{"id":"developer/service/service-api/service-push","title":"Push Notification","description":"Steedos\u652f\u6301\u5728\u7b2c\u4e09\u65b9\u5e94\u7528\u4e2d\u8c03\u7528\u63a5\u53e3\u6765\u53d1\u63a8\u9001\u901a\u77e5","sidebar":"developer"},"developer/service/service-api/service-sms":{"id":"developer/service/service-api/service-sms","title":"SMS Notification","description":"Applying for SMS Service","sidebar":"developer"},"developer/setup/create-steedos-app":{"id":"developer/setup/create-steedos-app","title":"Create a New Project","description":"The easiest way to setup a project is to use create-steedos-app. This CLI tool allows you to quickly start building a new steedos project and sets everything up for you.","sidebar":"developer"},"developer/setup/overview":{"id":"developer/setup/overview","title":"Overview","description":"Steedos DX Project is a workflow methodology for managing and developing Steedos applications, emphasizing a source-driven approach for more efficient version control and team collaboration. The Steedos DX project folder typically contains the following elements:","sidebar":"developer"},"developer/setup/project-start":{"id":"developer/setup/project-start","title":"Run Project","description":"The package of the Steedos Platform consists of metadata and microservices and needs to be loaded into the Steedos Platform to run.","sidebar":"developer"},"developer/setup/README":{"id":"developer/setup/README","title":"Setup Project","description":"Steedos Developer Experience (DX) is a new way to manage and develop apps on the Steedos Low-Code Platform across their entire lifecycle. It brings together the best of the Low-Code Platform to enable source-driven development, team collaboration with governance, and new levels of agility for custom app development on Steedos.","sidebar":"developer"},"developer/setup/sample-repository":{"id":"developer/setup/sample-repository","title":"Sample Project on GitHub","description":"To get started quickly, see the https://github.com/steedos-labs/contract GitHub repo. This standalone application contains an example Steedos DX project with multiple custom objects, sample data.","sidebar":"developer"},"developer/setup/steedos-cli":{"id":"developer/setup/steedos-cli","title":"Install Steedos Cli","description":"Introduction","sidebar":"developer"},"getting-started/README":{"id":"getting-started/README","title":"What is Steedos?","description":"Steedos, an open-source low-code development platform, redefines the way enterprise applications are built. It enables users without a programming background to quickly launch and deploy applications, greatly simplifying the traditional development process. For experienced developers, Steedos offers a powerful set of tools and frameworks to support in-depth customization and complex system integrations. This unique combination makes Steedos a truly adaptable platform for various business needs, whether it\'s rapid development of simple applications or advanced enterprise system integrations, all can be efficiently and flexibly realized on this platform.","sidebar":"platform"},"getting-started/tutorials/README":{"id":"getting-started/tutorials/README","title":"Steedos Tutorials","description":"","sidebar":"platform"},"getting-started/tutorials/the-basics/app":{"id":"getting-started/tutorials/the-basics/app","title":"Lesson 3: Creating Application","description":"Steedos allows users to create custom applications to meet various business needs. Custom applications are a collection of logically related objects, fields, functionalities, and layouts. This tutorial will guide you on how to create a Todos application in Steedos, and link it to the Projects and Todos objects.","sidebar":"platform"},"getting-started/tutorials/the-basics/object":{"id":"getting-started/tutorials/the-basics/object","title":"Lesson 1: Creating Objects","description":"Steedos offers powerful features that allow users to create and manage custom objects to meet specific business needs. Custom objects can be seen as tables in a database, storing data specific to an enterprise. This tutorial will detail how to create and use a custom object \u2014 the Todos object \u2014 in Steedos.","sidebar":"platform"},"getting-started/tutorials/the-basics/README":{"id":"getting-started/tutorials/the-basics/README","title":"The Basics","description":"In this tutorial, we will create a simple Todos application using Steedos. This application will allow users to add, view, and manage their to-do tasks.","sidebar":"platform"},"getting-started/tutorials/the-basics/relationship":{"id":"getting-started/tutorials/the-basics/relationship","title":"Lesson 2: Defining Relationships","description":"In Steedos, understanding and utilizing object relationships is key to building effective and feature-rich custom applications. Object relationships allow different objects to be connected, enabling data association and integration. This tutorial will explain the concept and steps of object relationships through a simple application example \u2014 linking Todos object to Projects object.","sidebar":"platform"},"getting-started/tutorials/the-basics/workflow-rules":{"id":"getting-started/tutorials/the-basics/workflow-rules","title":"Lesson 4: Workflow Rules","description":"In this section, we will delve into the automation features of Steedos, exploring how to use workflow rules to automate tasks. We will go through a practical case \u2013 creating a workflow rule that sends reminders to assignees (Assignees) when a task (such as the Todos object) is created, modified, or deleted.","sidebar":"platform"},"getting-started/user/download-apps":{"id":"getting-started/user/download-apps","title":"Download Apps","description":"Instructions for using the Steedos desktop and mobile clients.","sidebar":"platform"},"getting-started/user/overview":{"id":"getting-started/user/overview","title":"Overview of the Steedos Interface","description":"Steedos Platform is designed to empower users with a suite of tools that streamline the creation, management, and optimization of business applications. With its user-friendly interface and robust features, Steedos Platform enables you to harness the power of low-code development to drive innovation and efficiency within your organization.","sidebar":"platform"},"getting-started/user/README":{"id":"getting-started/user/README","title":"User Guide","description":"Steedos Platform is a comprehensive low-code development platform that allows users to build custom applications tailored to their unique business needs. It provides a flexible and intuitive environment for users to design, develop, and deploy applications with minimal coding required. Whether you\'re looking to manage customer relationships, streamline internal processes, or analyze data, Steedos Platform offers the versatility and scalability to meet your objectives.","sidebar":"platform"},"no-code":{"id":"no-code","title":"Extend Steedos with Clicks, Not Code","description":"Ready to go beyond the basics of Steedos administration? Want to customize your org, push its boundaries, and enhance its functionality? You can do that and so much more without writing a single line of code. All you need is your mouse and a sense of adventure. Enhance your objects, data, and fields, customize your org\u2019s look and feel, augment your business processes, and even create apps\u2014all using point-and-click tools."},"no-code/application/app":{"id":"no-code/application/app","title":"Creating Your First Application","description":"The Steedos platform comes with built-in visual application building tools that empower you to customize Steedos to meet your business needs. You can also build your own applications to share and store information that\'s important to you, all without needing any programming knowledge.","sidebar":"platform"},"no-code/application/overview":{"id":"no-code/application/overview","title":"What is a Steedos Application?","description":"Within the Steedos platform, an Application is a software solution that supports specific business processes by integrating related functions and datasets. Applications can range from simple customer management tools to complex business management systems, providing customized user interfaces, database models, business logic, and integration services to meet the specific needs of a business.","sidebar":"platform"},"no-code/application/pages":{"id":"no-code/application/pages","title":"Micro Page Builder","description":"The Micro Page Builder in the Steedos platform is a powerful interface that allows users to design and customize their application pages using a drag-and-drop approach.","sidebar":"platform"},"no-code/application/README":{"id":"no-code/application/README","title":"Building Applications","description":"The Steedos platform comes with built-in visual application building tools that empower you to customize Steedos to meet your business needs.","sidebar":"platform"},"no-code/application/tab":{"id":"no-code/application/tab","title":"Tabs","description":"Tabs in Steedos applications serve as navigation elements, providing an intuitive way to access different objects, views, dashboards, or custom web pages. Here are the steps to create and manage tabs:","sidebar":"platform"},"no-code/customize/button":{"id":"no-code/customize/button","title":"Custom Button","description":"Create custom buttons for objects and design button functions using Amis.","sidebar":"platform"},"no-code/customize/external-datasources":{"id":"no-code/customize/external-datasources","title":"External Data Sources","description":"An external data source specifies how to access an external system. External data sources have associated external objects, which your users and the Steedos platform use to interact with the external data and content.","sidebar":"platform"},"no-code/customize/fields/field-attributes":{"id":"no-code/customize/fields/field-attributes","title":"Field Attributes","description":"Each field has a set of properties that define the behavior and appearance of the field:","sidebar":"platform"},"no-code/customize/fields/field-type-autonumber":{"id":"no-code/customize/fields/field-type-autonumber","title":"Auto Number Field","description":"Automatically assigns a unique number to each record. The maximum length of any auto-number field is 30 characters, 20 of which are reserved for prefix or suffix text.","sidebar":"platform"},"no-code/customize/fields/field-type-summary":{"id":"no-code/customize/fields/field-type-summary","title":"Roll-Up Summary Field","description":"A roll-up summary field calculates values from related records, such as those in a related list. You can create a roll-up summary field to display a value in a master record based on the values of fields in a detail record. The detail record must be related to the master through a master-detail relationship. For example, you want to display the sum of invoice amounts for all related invoice custom object records in an account\u2019s Invoices related list. You can display this total in a custom account field called Total Invoice Amount.","sidebar":"platform"},"no-code/customize/fields/field-types":{"id":"no-code/customize/fields/field-types","title":"Basic Field Types","description":"Steedos supports many different field types. Pick the right type, or convert an existing one.","sidebar":"platform"},"no-code/customize/fields/README":{"id":"no-code/customize/fields/README","title":"Field Types","description":"In Steedos, fields (also known as columns) are the fundamental elements for storing data within custom or standard objects. Each field has a specific type, which defines the kind of data it can store, such as numbers, text, dates, or relationship links.","sidebar":"platform"},"no-code/customize/fields/relationship":{"id":"no-code/customize/fields/relationship","title":"Object Relationship Fields","description":"Create relationships to link objects with each other, so that when your users view records, they can also see related data. For example, link a custom object called Bugs to cases to track product defects that are associated with customer cases.","sidebar":"platform"},"no-code/customize/formula/cross-object":{"id":"no-code/customize/formula/cross-object","title":"What Is a Cross-Object Formula?","description":"A Cross-object formula is a formula that spans two related objects and references merge fields on those objects. A cross-object formula can reference merge fields from a master (\u201cparent\u201d) object if an object is on the detail side of a master-detail relationship. A cross-object formula also works with lookup relationships.","sidebar":"platform"},"no-code/customize/formula/datetime":{"id":"no-code/customize/formula/datetime","title":"Using Date, Date/Time, and Time Values in Formulas","description":"Date formulas are useful for managing payment deadlines, contract ages, or any other features of your organization that are time or date dependent.","sidebar":"platform"},"no-code/customize/formula/formula-field":{"id":"no-code/customize/formula/formula-field","title":"Formula Field Types","description":"The data type of a formula determines the type of data you expect returned from your formula.","sidebar":"platform"},"no-code/customize/formula/functions":{"id":"no-code/customize/formula/functions","title":"Formula Functions","description":"Use operators and functions when building formulas. All functions are available everywhere that you can include a formula such as formula fields, validation rules, approval processes, and workflow rules, unless otherwise specified.","sidebar":"platform"},"no-code/customize/formula/overview":{"id":"no-code/customize/formula/overview","title":"Formula Overview","description":"Where are Formulas Used in Steedos?","sidebar":"platform"},"no-code/customize/formula/README":{"id":"no-code/customize/formula/README","title":"Calculate Field Values with Formulas","description":"A formula is an algorithm that derives its value from other fields, expressions, or values. Formulas can help you automatically calculate the value of a field based on other fields.","sidebar":"platform"},"no-code/customize/listview":{"id":"no-code/customize/listview","title":"List Views","description":"View, edit, and create records from a list. List views are a great way to sort, prioritize, and analyze the records that are most important to users.","sidebar":"platform"},"no-code/customize/object":{"id":"no-code/customize/object","title":"Custom Objects","description":"Building applications on the Steedos platform often requires the creation of one or more custom objects to store all necessary business data. Custom objects can be considered as tables in a database, containing a series of fields where you can store data.","sidebar":"platform"},"no-code/customize/object-relationship":{"id":"no-code/customize/object-relationship","title":"Object Relationships","description":"Steedos\'s robust data model allows you to build complex data structures by defining relationships between objects. These relationships are the foundation for connecting various data points and sharing data across the entire platform.","sidebar":"platform"},"no-code/customize/page-layout":{"id":"no-code/customize/page-layout","title":"Page Layouts","description":"Page layouts control the layout and organization of buttons, fields and related lists on object record pages. They also help determine which fields are visible, read only, and required. Use page layouts to customize the content of record pages for your users.","sidebar":"platform"},"no-code/customize/README":{"id":"no-code/customize/README","title":"Set Up Your Data Your Way","description":"Optimize your Steedos data to fit the unique needs of your users. You can create your own objects with data that fits together in the ways that make the most sense for you.","sidebar":"platform"},"no-code/customize/validation-rules":{"id":"no-code/customize/validation-rules","title":"Validation Rules","description":"Improve the quality of your data using validation rules. Validation rules verify that the data a user enters in a record meets the standards you specify before the user can save the record. A validation rule can contain a formula or expression that evaluates the data in one or more fields and returns a value of \u201cTrue\u201d or \u201cFalse\u201d. Validation rules also include an error message to display to the user when the rule returns a value of \u201cTrue\u201d due to an invalid value.","sidebar":"platform"},"plugins":{"id":"plugins","title":"Steedos Plugins","description":"Steedos is a potent low-code development platform that empowers users and developers to extend and enhance the platform\'s capabilities through its flexible plugin architecture. With Steedos plugins, you can integrate new functionalities seamlessly, meet specific business needs, while maintaining the stability and reliability of the core system.","sidebar":"platform"},"plugins/integration-ding":{"id":"plugins/integration-ding","title":"DingTalk","description":"Steedos can integrate with DingTalk to achieve single sign-on, message push, and organization synchronization.","sidebar":"platform"},"plugins/integration-qywx":{"id":"plugins/integration-qywx","title":"WeChat Work","description":"Steedos can also integrate with WeChat Work to achieve single sign-on, message push, and organization synchronization.","sidebar":"platform"}}}')}}]); \ No newline at end of file diff --git a/assets/js/93bb0895.8d0c6ba7.js b/assets/js/93bb0895.8d0c6ba7.js new file mode 100644 index 0000000000..1145f003bf --- /dev/null +++ b/assets/js/93bb0895.8d0c6ba7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[6773],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>g});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),p=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,g=u["".concat(l,".").concat(m)]||u[m]||d[m]||i;return n?r.createElement(g,a(a({ref:t},c),{},{components:n})):r.createElement(g,a({ref:t},c))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,a[1]=s;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var r=n(7462),o=(n(7294),n(3905));const i={title:"SSO API",description:"\u901a\u8fc7jwt\u5b9e\u73b0\u5916\u63a5\u5e94\u7528\u4e0e\u9b54\u65b9\u5e73\u53f0\u53cc\u5411\u5355\u70b9\u767b\u5f55\u3002"},a=void 0,s={unversionedId:"developer/integration/api-jwt-sso",id:"developer/integration/api-jwt-sso",title:"SSO API",description:"\u901a\u8fc7jwt\u5b9e\u73b0\u5916\u63a5\u5e94\u7528\u4e0e\u9b54\u65b9\u5e73\u53f0\u53cc\u5411\u5355\u70b9\u767b\u5f55\u3002",source:"@site/docs/developer/integration/api-jwt-sso.mdx",sourceDirName:"developer/integration",slug:"/developer/integration/api-jwt-sso",permalink:"/developer/integration/api-jwt-sso",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/developer/integration/api-jwt-sso.mdx",tags:[],version:"current",frontMatter:{title:"SSO API",description:"\u901a\u8fc7jwt\u5b9e\u73b0\u5916\u63a5\u5e94\u7528\u4e0e\u9b54\u65b9\u5e73\u53f0\u53cc\u5411\u5355\u70b9\u767b\u5f55\u3002"},sidebar:"developer",previous:{title:"Integration",permalink:"/developer/integration/"},next:{title:"Node-Red",permalink:"/developer/integration/node-red"}},l={},p=[{value:"Logging into the Steedos from external applications.",id:"logging-into-the-steedos-from-external-applications",level:2},{value:"Preparation",id:"preparation",level:3},{value:"Next",id:"next",level:3},{value:"Example",id:"example",level:3},{value:"Login to External Applications via Steedos",id:"login-to-external-applications-via-steedos",level:2},{value:"Process Description",id:"process-description",level:3},{value:"Example",id:"example-1",level:3}],c={toc:p},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"logging-into-the-steedos-from-external-applications"},"Logging into the Steedos from external applications."),(0,o.kt)("h3",{id:"preparation"},"Preparation"),(0,o.kt)("p",null,"1\u3001 Steedos needs to be configured with environment variables enabled for single sign-on. Add the following to the .env.local file:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-env"},"# JWT SSO\nSTEEDOS_IDENTITY_JWT_ENABLED=true\n")),(0,o.kt)("h3",{id:"next"},"Next"),(0,o.kt)("p",null,"1\u3001The external application generates a JWT in the custom server interface.\n2\u3001The external application redirects to Steedos interface using the following GET request: {root_url}/accounts/jwt/login?t={jwt}&redirect={redirectURL} to achieve single sign-on."),(0,o.kt)("h3",{id:"example"},"Example"),(0,o.kt)("p",null,"1\u3001To create a new application in Steedos, you need to specify an API name (e.g. finance) and an API key (e.g. app_api_secret)."),(0,o.kt)("p",null,"2\u3001The external application's frontend button calls the custom API (e.g. GET /api/get/token) to generate a JWT."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js"},"module.exports = {\n sso: function (object_name, record_id) {\n const getTokenURL = '/api/get/token'; \n\n const result = Steedos.authRequest(getTokenURL, {\n type: 'GET',\n async: false,\n contentType: 'application/json'\n });\n\n const token = result.token;\n const PLATFORM_ROOT_URL = 'https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io' \n window.open(`${PLATFORM_ROOT_URL}/accounts/jwt/login?t=${token}&redirect=${PLATFORM_ROOT_URL}`, '_blank') \n\n },\n ssoVisible: function () {\n return true\n }\n}\n")),(0,o.kt)("p",null,"3\u3001A custom server-side API needs to be implemented."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js"},"const express = require(\"express\");\nconst router = express.Router();\nconst core = require('@steedos/core');\nconst jwt = require('jsonwebtoken');\n\nrouter.get('/api/get/token', core.requireAuthentication, async function (req, res) {\n const userSession = req.user;\n\n var secret = 'app_api_secret' \n var options = { expiresIn: 30 } \n var token = jwt.sign({\n profile: {\n email: userSession.email \n },\n app_code: 'finance' \n }, secret, options);\n\n res.status(200).send({\n token: token\n });\n});\nexports.default = router;\n")),(0,o.kt)("h2",{id:"login-to-external-applications-via-steedos"},"Login to External Applications via Steedos"),(0,o.kt)("h3",{id:"process-description"},"Process Description"),(0,o.kt)("p",null,"1\u3001Create a new application in Steedos, specifying the external link and API key."),(0,o.kt)("p",null,'2\u3001Click on the external application in the launcher and redirect to the external link, passing the "t" parameter in the URL.'),(0,o.kt)("p",null,'3\u3001The external application parses the "t" parameter and redirects the user to the application.'),(0,o.kt)("h3",{id:"example-1"},"Example"),(0,o.kt)("p",null,"1\u3001Create a new application in Steedos and specify the external link (e.g. GET ",(0,o.kt)("a",{parentName:"p",href:"https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io/api/sso"},"https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io/api/sso"),") and API key (e.g. app_api_secret)."),(0,o.kt)("p",null,"2\u3001In the application launcher, click on the external application and you will be redirected to the external link."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js"},"https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io/api/sso?t=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvYmplY3RfbmFtZSI6InNwYWNlX3VzZXJzIiwiZG9jIjp7Il9pZCI6IkFGTkVuQ3hiU29HRWc0b2NmIiwibmFtZSI6Inh4eCIsInVzZXJuYW1lIjoieHh4eHh4IiwiZW1haWwiOiJzQHMuY29tIn0sImlhdCI6MTY2OTI2NjA0NiwiZXhwIjoxNjY5MjY5NjQ2fQ.qeld2kTl5zjLGjCWgk3cb6UPEPlqmzMaME20mo_t-t4\n")),(0,o.kt)("p",null,"3\u3001To parse the token in the external application"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js"},"const express = require(\"express\");\nconst router = express.Router();\nconst jwt = require('jsonwebtoken')\n\nrouter.get('/api/sso', async function (req, res) {\n console.log(req.query)\n // {\n // t: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvYmplY3RfbmFtZSI6InNwYWNlX3VzZXJzIiwiZG9jIjp7Il9pZCI6IkFGTkVuQ3hiU29HRWc0b2NmIiwibmFtZSI6Inh4eCIsInVzZXJuYW1lIjoieHh4eHh4IiwiZW1haWwiOiJzQHMuY29tIn0sImlhdCI6MTY2OTI2NjA0NiwiZXhwIjoxNjY5MjY5NjQ2fQ.qeld2kTl5zjLGjCWgk3cb6UPEPlqmzMaME20mo_t-t4'\n // }\n const payload = jwt.verify(req.query.t, 'app_api_secret') \n console.log(payload)\n // {\n // profile: {\n // name: 'xxx',\n // username: 'xxxxxx',\n // email: 's@s.com'\n // },\n // iat: 1669266046,\n // exp: 1669269646\n // }\n\n res.status(200).send({ message: 'router ok' });\n});\nexports.default = router;\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/952b7352.16b76ebe.js b/assets/js/952b7352.16b76ebe.js new file mode 100644 index 0000000000..e8af1f6f6f --- /dev/null +++ b/assets/js/952b7352.16b76ebe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7150],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>c});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=n.createContext({}),s=function(e){var t=n.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=s(e.components);return n.createElement(o.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,o=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),d=s(a),k=r,c=d["".concat(o,".").concat(k)]||d[k]||m[k]||l;return a?n.createElement(c,i(i({ref:t},u),{},{components:a})):n.createElement(c,i({ref:t},u))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p[d]="string"==typeof e?e:r,i[1]=p;for(var s=2;s{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>p,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const l={title:"Process API",description:"\u6839\u636e\u6d41\u7a0b\u7684\u5143\u6570\u636e\u5b9a\u4e49\uff0c\u81ea\u52a8\u751f\u6210\u5ba1\u6279\u76f8\u5173API\u3002"},i=void 0,p={unversionedId:"developer/api/api-process",id:"developer/api/api-process",title:"Process API",description:"\u6839\u636e\u6d41\u7a0b\u7684\u5143\u6570\u636e\u5b9a\u4e49\uff0c\u81ea\u52a8\u751f\u6210\u5ba1\u6279\u76f8\u5173API\u3002",source:"@site/docs/developer/api/api-process.mdx",sourceDirName:"developer/api",slug:"/developer/api/api-process",permalink:"/developer/api/api-process",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/developer/api/api-process.mdx",tags:[],version:"current",frontMatter:{title:"Process API",description:"\u6839\u636e\u6d41\u7a0b\u7684\u5143\u6570\u636e\u5b9a\u4e49\uff0c\u81ea\u52a8\u751f\u6210\u5ba1\u6279\u76f8\u5173API\u3002"},sidebar:"developer",previous:{title:"OpenAPI",permalink:"/developer/api/openapi"},next:{title:"Integration",permalink:"/developer/integration/"}},o={},s=[{value:"Interface Validation",id:"interface-validation",level:2},{value:"API List",id:"api-list",level:2},{value:"API Specifications",id:"api-specifications",level:2},{value:"Start Approval",id:"start-approval",level:3},{value:"URI",id:"uri",level:4},{value:"Method",id:"method",level:4},{value:"Request Parameters",id:"request-parameters",level:4},{value:"Response",id:"response",level:4},{value:"Save Draft Approval Form",id:"save-draft-approval-form",level:3},{value:"URI",id:"uri-1",level:4},{value:"Method",id:"method-1",level:4},{value:"Request parameters.",id:"request-parameters-1",level:4},{value:"Response",id:"response-1",level:4},{value:"Submitting a Draft Application",id:"submitting-a-draft-application",level:3},{value:"URI",id:"uri-2",level:4},{value:"Method",id:"method-2",level:4},{value:"Request Parameters",id:"request-parameters-2",level:4},{value:"Response",id:"response-2",level:4},{value:"Submitting an Approval Application",id:"submitting-an-approval-application",level:3},{value:"URI",id:"uri-3",level:4},{value:"Method",id:"method-3",level:4},{value:"Request Parameters",id:"request-parameters-3",level:4},{value:"Response",id:"response-3",level:4}],u={toc:s},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Specifications for Low-code platform's workflow engine related API interfaces, including rules for request parameters and return values, are stipulated in this agreement."),(0,r.kt)("h2",{id:"interface-validation"},"Interface Validation"),(0,r.kt)("p",null,"To call the API interfaces, user authentication information must be added to the request headers. For details, please refer to ",(0,r.kt)("a",{parentName:"p",href:"./api-validate"},"Interface Validation"),"."),(0,r.kt)("h2",{id:"api-list"},"API List"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Request Operation"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Start Approval"),(0,r.kt)("td",{parentName:"tr",align:null},"POST")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Save Approval as Draft"),(0,r.kt)("td",{parentName:"tr",align:null},"POST")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Submit Draft Application"),(0,r.kt)("td",{parentName:"tr",align:null},"POST")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Submit Approval Request"),(0,r.kt)("td",{parentName:"tr",align:null},"POST")))),(0,r.kt)("h2",{id:"api-specifications"},"API Specifications"),(0,r.kt)("p",null,"Below are the detailed specifications for each workflow API."),(0,r.kt)("h3",{id:"start-approval"},"Start Approval"),(0,r.kt)("p",null,"Create a new approval request in draft status."),(0,r.kt)("h4",{id:"uri"},"URI"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"/api/workflow/v2/draft\n")),(0,r.kt)("h4",{id:"method"},"Method"),(0,r.kt)("p",null,"POST"),(0,r.kt)("h4",{id:"request-parameters"},"Request Parameters"),(0,r.kt)("p",null,"The following parameters are required when requesting this interface."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"instance"),(0,r.kt)("td",{parentName:"tr",align:null},"object"),(0,r.kt)("td",{parentName:"tr",align:null},"Approval Form Field Values")))),(0,r.kt)("p",null,"The 'instance' attribute is described as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"space"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Workspace ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"flow"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Process ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"applicant"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Applicant ID")))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "instance": {\n "space": "hKdnwE55WcnWveYxS",\n "flow": "BayiYu3sk2hv3M2HW",\n "applicant": "62ede4f62161e377e35de58c"\n }\n}\n')),(0,r.kt)("h4",{id:"response"},"Response"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The format of the return value when the API interface request is successful is as follows:")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"instance"),(0,r.kt)("td",{parentName:"tr",align:null},"object"),(0,r.kt)("td",{parentName:"tr",align:null},"Approval form field value")))),(0,r.kt)("p",null,"Where the instance property is described as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"_id"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"The successfully created application form ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"space"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Workspace ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"flow"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Workflow ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"flow_version"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Workflow version ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"form"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Form ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"form_version"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Form version ID")))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "instance": {\n "_id": "zMiGNe2sJm9KuruvM",\n "space": "hKdnwE55WcnWveYxS",\n "flow": "BayiYu3sk2hv3M2HW",\n "flow_version": "Nvc5wjsgHYkXnNHhk",\n "form": "Pdq8neQvT7fv5aTyd",\n "form_version": "thX4kKBAx6iCgciWD"\n }\n}\n')),(0,r.kt)("p",null,"The instance returned in the response contains information about the successfully created approval record."),(0,r.kt)("h3",{id:"save-draft-approval-form"},"Save Draft Approval Form"),(0,r.kt)("h4",{id:"uri-1"},"URI"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"/api/workflow/v2/instance/save\n")),(0,r.kt)("h4",{id:"method-1"},"Method"),(0,r.kt)("p",null,"POST"),(0,r.kt)("h4",{id:"request-parameters-1"},"Request parameters."),(0,r.kt)("p",null,"The following parameters need to be passed when requesting this API."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"instance"),(0,r.kt)("td",{parentName:"tr",align:null},"object"),(0,r.kt)("td",{parentName:"tr",align:null},"Approval Form Field Values")))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "instance": {\n "_id": "zMiGNe2sJm9KuruvM",\n "space": "hKdnwE55WcnWveYxS",\n "flow": "BayiYu3sk2hv3M2HW",\n "flow_version": "Nvc5wjsgHYkXnNHhk",\n "form": "Pdq8neQvT7fv5aTyd",\n "form_version": "thX4kKBAx6iCgciWD",\n "applicant": "62ede4f62161e377e35de58c",\n "applicant_name": "xxx",\n "applicant_organization": "XypyNbzGCJbHMNyWv",\n "applicant_organization_name": "xxx",\n "applicant_organization_fullname": "xxx",\n "code": "",\n "traces": [\n {\n "_id": "7f316cb404fddf2098c8fd2d",\n "approves": [\n {\n "_id": "97628d0b9a33b541816caeeb",\n "description": "",\n "values": {\n "field1": "xx",\n "field2": "xx",\n "field3": "xx"\n },\n "next_steps": [\n {\n "step": "e28faf97-a1c4-4bdd-90e5-1b43d42aa10b",\n "users": []\n }\n ]\n }\n ]\n }\n ],\n "submit_date": xxx\n }\n}\n')),(0,r.kt)("h4",{id:"response-1"},"Response"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The format of the successful API interface request response is as follows:")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"instance"),(0,r.kt)("td",{parentName:"tr",align:null},"boolean"),(0,r.kt)("td",{parentName:"tr",align:null},"Was the operation successful?")))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "instance": true\n}\n')),(0,r.kt)("h3",{id:"submitting-a-draft-application"},"Submitting a Draft Application"),(0,r.kt)("p",null,"Submit an application in draft status to the next step"),(0,r.kt)("h4",{id:"uri-2"},"URI"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"/api/workflow/submit\n")),(0,r.kt)("h4",{id:"method-2"},"Method"),(0,r.kt)("p",null,"POST"),(0,r.kt)("h4",{id:"request-parameters-2"},"Request Parameters"),(0,r.kt)("p",null,"The following parameters need to be passed when requesting this API."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Instances"),(0,r.kt)("td",{parentName:"tr",align:null},"object[]"),(0,r.kt)("td",{parentName:"tr",align:null},"The content of the application form.")))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "Instances": [{\n "_id": "e6viWhvARgo4xSxBC",\n "inbox_users": [],\n "name": "Test",\n "submitter": "62ede4f62161e377e35de58c",\n "flow": "BayiYu3sk2hv3M2HW",\n "applicant": "62ede4f62161e377e35de58c",\n "traces": [{\n "_id": "0aed02a8113d7e1a22d5a245",\n "step": "Ryu58zkQKrFLdvWpw",\n "approves": [{\n "_id": "5865e212c0e80024005090f9",\n "description": "",\n "values": {\n "field1": "xxx",\n "field2": "xxx",\n "field3": "xxx"\n },\n "next_steps": [{\n "step": "e28faf97-a1c4-4bdd-90e5-1b43d42aa10b",\n "users": [\n "62ede4f62161e377e35de58c"\n ]\n }]\n }]\n }]\n }]\n}\n')),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"The traces contains the signature history for each step, while approves contains the approval process within each signature history, which records detailed information about the approval form.")),(0,r.kt)("h4",{id:"response-2"},"Response"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"When this API interface is requested successfully, the format of the return value is as follows:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "result": [...]\n}\n')),(0,r.kt)("p",null,"The result returns an array of objects. The key-value information contained in this array is shown as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"alerts"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Prompt messages")))),(0,r.kt)("p",null,"The alerts mainly prompts whether the process version has been upgraded."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"When this API interface fails to request, the format of the return value is as follows:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n errors: [{ errorMessage: "..." }]\n}\n')),(0,r.kt)("h3",{id:"submitting-an-approval-application"},"Submitting an Approval Application"),(0,r.kt)("p",null,"Submit an application in approval status to the next step."),(0,r.kt)("h4",{id:"uri-3"},"URI"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"/api/workflow/engine\n")),(0,r.kt)("h4",{id:"method-3"},"Method"),(0,r.kt)("p",null,"POST"),(0,r.kt)("h4",{id:"request-parameters-3"},"Request Parameters"),(0,r.kt)("p",null,"The following parameters need to be passed when requesting this API."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Approvals"),(0,r.kt)("td",{parentName:"tr",align:null},"object[]"),(0,r.kt)("td",{parentName:"tr",align:null},"The content of the approval")))),(0,r.kt)("h4",{id:"response-3"},"Response"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"When this API interface is requested successfully, an empty object is returned.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"When this API interface fails to request, the format of the return value is as follows:"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n errors: [{ errorMessage: "..." }]\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/952b7352.e2f49be9.js b/assets/js/952b7352.e2f49be9.js deleted file mode 100644 index 1bcff7d192..0000000000 --- a/assets/js/952b7352.e2f49be9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[7150],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>c});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),o=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=o(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),d=o(a),k=r,c=d["".concat(s,".").concat(k)]||d[k]||m[k]||l;return a?n.createElement(c,i(i({ref:t},u),{},{components:a})):n.createElement(c,i({ref:t},u))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p[d]="string"==typeof e?e:r,i[1]=p;for(var o=2;o{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>p,toc:()=>o});var n=a(7462),r=(a(7294),a(3905));const l={title:"Process API",description:"\u6839\u636e\u6d41\u7a0b\u7684\u5143\u6570\u636e\u5b9a\u4e49\uff0c\u81ea\u52a8\u751f\u6210\u5ba1\u6279\u76f8\u5173API\u3002"},i=void 0,p={unversionedId:"developer/api/api-process",id:"developer/api/api-process",title:"Process API",description:"\u6839\u636e\u6d41\u7a0b\u7684\u5143\u6570\u636e\u5b9a\u4e49\uff0c\u81ea\u52a8\u751f\u6210\u5ba1\u6279\u76f8\u5173API\u3002",source:"@site/docs/developer/api/api-process.mdx",sourceDirName:"developer/api",slug:"/developer/api/api-process",permalink:"/developer/api/api-process",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/developer/api/api-process.mdx",tags:[],version:"current",frontMatter:{title:"Process API",description:"\u6839\u636e\u6d41\u7a0b\u7684\u5143\u6570\u636e\u5b9a\u4e49\uff0c\u81ea\u52a8\u751f\u6210\u5ba1\u6279\u76f8\u5173API\u3002"},sidebar:"developer",previous:{title:"SSO API",permalink:"/developer/api/api-jwt-sso"}},s={},o=[{value:"Interface Validation",id:"interface-validation",level:2},{value:"API List",id:"api-list",level:2},{value:"API Specifications",id:"api-specifications",level:2},{value:"Start Approval",id:"start-approval",level:3},{value:"URI",id:"uri",level:4},{value:"Method",id:"method",level:4},{value:"Request Parameters",id:"request-parameters",level:4},{value:"Response",id:"response",level:4},{value:"Save Draft Approval Form",id:"save-draft-approval-form",level:3},{value:"URI",id:"uri-1",level:4},{value:"Method",id:"method-1",level:4},{value:"Request parameters.",id:"request-parameters-1",level:4},{value:"Response",id:"response-1",level:4},{value:"Submitting a Draft Application",id:"submitting-a-draft-application",level:3},{value:"URI",id:"uri-2",level:4},{value:"Method",id:"method-2",level:4},{value:"Request Parameters",id:"request-parameters-2",level:4},{value:"Response",id:"response-2",level:4},{value:"Submitting an Approval Application",id:"submitting-an-approval-application",level:3},{value:"URI",id:"uri-3",level:4},{value:"Method",id:"method-3",level:4},{value:"Request Parameters",id:"request-parameters-3",level:4},{value:"Response",id:"response-3",level:4}],u={toc:o},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Specifications for Low-code platform's workflow engine related API interfaces, including rules for request parameters and return values, are stipulated in this agreement."),(0,r.kt)("h2",{id:"interface-validation"},"Interface Validation"),(0,r.kt)("p",null,"To call the API interfaces, user authentication information must be added to the request headers. For details, please refer to ",(0,r.kt)("a",{parentName:"p",href:"./api-validate"},"Interface Validation"),"."),(0,r.kt)("h2",{id:"api-list"},"API List"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Request Operation"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Start Approval"),(0,r.kt)("td",{parentName:"tr",align:null},"POST")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Save Approval as Draft"),(0,r.kt)("td",{parentName:"tr",align:null},"POST")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Submit Draft Application"),(0,r.kt)("td",{parentName:"tr",align:null},"POST")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Submit Approval Request"),(0,r.kt)("td",{parentName:"tr",align:null},"POST")))),(0,r.kt)("h2",{id:"api-specifications"},"API Specifications"),(0,r.kt)("p",null,"Below are the detailed specifications for each workflow API."),(0,r.kt)("h3",{id:"start-approval"},"Start Approval"),(0,r.kt)("p",null,"Create a new approval request in draft status."),(0,r.kt)("h4",{id:"uri"},"URI"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"/api/workflow/v2/draft\n")),(0,r.kt)("h4",{id:"method"},"Method"),(0,r.kt)("p",null,"POST"),(0,r.kt)("h4",{id:"request-parameters"},"Request Parameters"),(0,r.kt)("p",null,"The following parameters are required when requesting this interface."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"instance"),(0,r.kt)("td",{parentName:"tr",align:null},"object"),(0,r.kt)("td",{parentName:"tr",align:null},"Approval Form Field Values")))),(0,r.kt)("p",null,"The 'instance' attribute is described as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"space"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Workspace ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"flow"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Process ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"applicant"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Applicant ID")))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "instance": {\n "space": "hKdnwE55WcnWveYxS",\n "flow": "BayiYu3sk2hv3M2HW",\n "applicant": "62ede4f62161e377e35de58c"\n }\n}\n')),(0,r.kt)("h4",{id:"response"},"Response"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The format of the return value when the API interface request is successful is as follows:")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"instance"),(0,r.kt)("td",{parentName:"tr",align:null},"object"),(0,r.kt)("td",{parentName:"tr",align:null},"Approval form field value")))),(0,r.kt)("p",null,"Where the instance property is described as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"_id"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"The successfully created application form ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"space"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Workspace ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"flow"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Workflow ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"flow_version"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Workflow version ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"form"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Form ID")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"form_version"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Form version ID")))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "instance": {\n "_id": "zMiGNe2sJm9KuruvM",\n "space": "hKdnwE55WcnWveYxS",\n "flow": "BayiYu3sk2hv3M2HW",\n "flow_version": "Nvc5wjsgHYkXnNHhk",\n "form": "Pdq8neQvT7fv5aTyd",\n "form_version": "thX4kKBAx6iCgciWD"\n }\n}\n')),(0,r.kt)("p",null,"The instance returned in the response contains information about the successfully created approval record."),(0,r.kt)("h3",{id:"save-draft-approval-form"},"Save Draft Approval Form"),(0,r.kt)("h4",{id:"uri-1"},"URI"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"/api/workflow/v2/instance/save\n")),(0,r.kt)("h4",{id:"method-1"},"Method"),(0,r.kt)("p",null,"POST"),(0,r.kt)("h4",{id:"request-parameters-1"},"Request parameters."),(0,r.kt)("p",null,"The following parameters need to be passed when requesting this API."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"instance"),(0,r.kt)("td",{parentName:"tr",align:null},"object"),(0,r.kt)("td",{parentName:"tr",align:null},"Approval Form Field Values")))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "instance": {\n "_id": "zMiGNe2sJm9KuruvM",\n "space": "hKdnwE55WcnWveYxS",\n "flow": "BayiYu3sk2hv3M2HW",\n "flow_version": "Nvc5wjsgHYkXnNHhk",\n "form": "Pdq8neQvT7fv5aTyd",\n "form_version": "thX4kKBAx6iCgciWD",\n "applicant": "62ede4f62161e377e35de58c",\n "applicant_name": "xxx",\n "applicant_organization": "XypyNbzGCJbHMNyWv",\n "applicant_organization_name": "xxx",\n "applicant_organization_fullname": "xxx",\n "code": "",\n "traces": [\n {\n "_id": "7f316cb404fddf2098c8fd2d",\n "approves": [\n {\n "_id": "97628d0b9a33b541816caeeb",\n "description": "",\n "values": {\n "field1": "xx",\n "field2": "xx",\n "field3": "xx"\n },\n "next_steps": [\n {\n "step": "e28faf97-a1c4-4bdd-90e5-1b43d42aa10b",\n "users": []\n }\n ]\n }\n ]\n }\n ],\n "submit_date": xxx\n }\n}\n')),(0,r.kt)("h4",{id:"response-1"},"Response"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The format of the successful API interface request response is as follows:")),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"instance"),(0,r.kt)("td",{parentName:"tr",align:null},"boolean"),(0,r.kt)("td",{parentName:"tr",align:null},"Was the operation successful?")))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "instance": true\n}\n')),(0,r.kt)("h3",{id:"submitting-a-draft-application"},"Submitting a Draft Application"),(0,r.kt)("p",null,"Submit an application in draft status to the next step"),(0,r.kt)("h4",{id:"uri-2"},"URI"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"/api/workflow/submit\n")),(0,r.kt)("h4",{id:"method-2"},"Method"),(0,r.kt)("p",null,"POST"),(0,r.kt)("h4",{id:"request-parameters-2"},"Request Parameters"),(0,r.kt)("p",null,"The following parameters need to be passed when requesting this API."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Instances"),(0,r.kt)("td",{parentName:"tr",align:null},"object[]"),(0,r.kt)("td",{parentName:"tr",align:null},"The content of the application form.")))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "Instances": [{\n "_id": "e6viWhvARgo4xSxBC",\n "inbox_users": [],\n "name": "Test",\n "submitter": "62ede4f62161e377e35de58c",\n "flow": "BayiYu3sk2hv3M2HW",\n "applicant": "62ede4f62161e377e35de58c",\n "traces": [{\n "_id": "0aed02a8113d7e1a22d5a245",\n "step": "Ryu58zkQKrFLdvWpw",\n "approves": [{\n "_id": "5865e212c0e80024005090f9",\n "description": "",\n "values": {\n "field1": "xxx",\n "field2": "xxx",\n "field3": "xxx"\n },\n "next_steps": [{\n "step": "e28faf97-a1c4-4bdd-90e5-1b43d42aa10b",\n "users": [\n "62ede4f62161e377e35de58c"\n ]\n }]\n }]\n }]\n }]\n}\n')),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"The traces contains the signature history for each step, while approves contains the approval process within each signature history, which records detailed information about the approval form.")),(0,r.kt)("h4",{id:"response-2"},"Response"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"When this API interface is requested successfully, the format of the return value is as follows:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n "result": [...]\n}\n')),(0,r.kt)("p",null,"The result returns an array of objects. The key-value information contained in this array is shown as follows:"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"alerts"),(0,r.kt)("td",{parentName:"tr",align:null},"string"),(0,r.kt)("td",{parentName:"tr",align:null},"Prompt messages")))),(0,r.kt)("p",null,"The alerts mainly prompts whether the process version has been upgraded."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"When this API interface fails to request, the format of the return value is as follows:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n errors: [{ errorMessage: "..." }]\n}\n')),(0,r.kt)("h3",{id:"submitting-an-approval-application"},"Submitting an Approval Application"),(0,r.kt)("p",null,"Submit an application in approval status to the next step."),(0,r.kt)("h4",{id:"uri-3"},"URI"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-text"},"/api/workflow/engine\n")),(0,r.kt)("h4",{id:"method-3"},"Method"),(0,r.kt)("p",null,"POST"),(0,r.kt)("h4",{id:"request-parameters-3"},"Request Parameters"),(0,r.kt)("p",null,"The following parameters need to be passed when requesting this API."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Name"),(0,r.kt)("th",{parentName:"tr",align:null},"Type"),(0,r.kt)("th",{parentName:"tr",align:null},"Description"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Approvals"),(0,r.kt)("td",{parentName:"tr",align:null},"object[]"),(0,r.kt)("td",{parentName:"tr",align:null},"The content of the approval")))),(0,r.kt)("h4",{id:"response-3"},"Response"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"When this API interface is requested successfully, an empty object is returned.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"When this API interface fails to request, the format of the return value is as follows:"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-json"},'{\n errors: [{ errorMessage: "..." }]\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/98e1679c.254b4c5a.js b/assets/js/98e1679c.fa615cda.js similarity index 81% rename from assets/js/98e1679c.254b4c5a.js rename to assets/js/98e1679c.fa615cda.js index 785c09d428..8c90aa173e 100644 --- a/assets/js/98e1679c.254b4c5a.js +++ b/assets/js/98e1679c.fa615cda.js @@ -1 +1 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1273],{3905:(e,r,n)=>{n.d(r,{Zo:()=>d,kt:()=>f});var t=n(7294);function i(e,r,n){return r in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,e}function o(e,r){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),n.push.apply(n,t)}return n}function s(e){for(var r=1;r=0||(i[n]=e[n]);return i}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=t.createContext({}),p=function(e){var r=t.useContext(c),n=r;return e&&(n="function"==typeof e?e(r):s(s({},r),e)),n},d=function(e){var r=p(e.components);return t.createElement(c.Provider,{value:r},e.children)},l="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},u=t.forwardRef((function(e,r){var n=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,d=a(e,["components","mdxType","originalType","parentName"]),l=p(n),u=i,f=l["".concat(c,".").concat(u)]||l[u]||m[u]||o;return n?t.createElement(f,s(s({ref:r},d),{},{components:n})):t.createElement(f,s({ref:r},d))}));function f(e,r){var n=arguments,i=r&&r.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=u;var a={};for(var c in r)hasOwnProperty.call(r,c)&&(a[c]=r[c]);a.originalType=e,a[l]="string"==typeof e?e:i,s[1]=a;for(var p=2;p{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>a,toc:()=>p});var t=n(7462),i=(n(7294),n(3905));const o={sidebar_position:12},s="Trigger managed permissions",a={unversionedId:"admin/permissions/before-find",id:"admin/permissions/before-find",title:"Trigger managed permissions",description:"While Steedos provides various built-in solutions to easily achieve precise field and record level permission control as described above, some permission requirements in unique project scenarios may not be met by these methods alone. Therefore, the Steedos permission engine also incorporates beforeFind triggers, which allow personalized and more advanced permission issues to be addressed through code.",source:"@site/docs/admin/permissions/before-find.md",sourceDirName:"admin/permissions",slug:"/admin/permissions/before-find",permalink:"/admin/permissions/before-find",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/admin/permissions/before-find.md",tags:[],version:"current",sidebarPosition:12,frontMatter:{sidebar_position:12},sidebar:"platform",previous:{title:"Sharing Rules",permalink:"/admin/permissions/sharing-rules"},next:{title:"Extend the Reach of Your Organization",permalink:"/integration"}},c={},p=[],d={toc:p},l="wrapper";function m(e){let{components:r,...n}=e;return(0,i.kt)(l,(0,t.Z)({},d,n,{components:r,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"trigger-managed-permissions"},"Trigger managed permissions"),(0,i.kt)("p",null,"While Steedos provides various built-in solutions to easily achieve precise field and record level permission control as described above, some permission requirements in unique project scenarios may not be met by these methods alone. Therefore, the Steedos permission engine also incorporates beforeFind triggers, which allow personalized and more advanced permission issues to be addressed through code."))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[1273],{3905:(e,r,n)=>{n.d(r,{Zo:()=>d,kt:()=>f});var t=n(7294);function i(e,r,n){return r in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,e}function o(e,r){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),n.push.apply(n,t)}return n}function s(e){for(var r=1;r=0||(i[n]=e[n]);return i}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=t.createContext({}),p=function(e){var r=t.useContext(c),n=r;return e&&(n="function"==typeof e?e(r):s(s({},r),e)),n},d=function(e){var r=p(e.components);return t.createElement(c.Provider,{value:r},e.children)},l="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},u=t.forwardRef((function(e,r){var n=e.components,i=e.mdxType,o=e.originalType,c=e.parentName,d=a(e,["components","mdxType","originalType","parentName"]),l=p(n),u=i,f=l["".concat(c,".").concat(u)]||l[u]||m[u]||o;return n?t.createElement(f,s(s({ref:r},d),{},{components:n})):t.createElement(f,s({ref:r},d))}));function f(e,r){var n=arguments,i=r&&r.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=u;var a={};for(var c in r)hasOwnProperty.call(r,c)&&(a[c]=r[c]);a.originalType=e,a[l]="string"==typeof e?e:i,s[1]=a;for(var p=2;p{n.r(r),n.d(r,{assets:()=>c,contentTitle:()=>s,default:()=>m,frontMatter:()=>o,metadata:()=>a,toc:()=>p});var t=n(7462),i=(n(7294),n(3905));const o={sidebar_position:12},s="Trigger managed permissions",a={unversionedId:"admin/permissions/before-find",id:"admin/permissions/before-find",title:"Trigger managed permissions",description:"While Steedos provides various built-in solutions to easily achieve precise field and record level permission control as described above, some permission requirements in unique project scenarios may not be met by these methods alone. Therefore, the Steedos permission engine also incorporates beforeFind triggers, which allow personalized and more advanced permission issues to be addressed through code.",source:"@site/docs/admin/permissions/before-find.md",sourceDirName:"admin/permissions",slug:"/admin/permissions/before-find",permalink:"/admin/permissions/before-find",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/admin/permissions/before-find.md",tags:[],version:"current",sidebarPosition:12,frontMatter:{sidebar_position:12},sidebar:"platform",previous:{title:"Sharing Rules",permalink:"/admin/permissions/sharing-rules"},next:{title:"Steedos Plugins",permalink:"/plugins"}},c={},p=[],d={toc:p},l="wrapper";function m(e){let{components:r,...n}=e;return(0,i.kt)(l,(0,t.Z)({},d,n,{components:r,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"trigger-managed-permissions"},"Trigger managed permissions"),(0,i.kt)("p",null,"While Steedos provides various built-in solutions to easily achieve precise field and record level permission control as described above, some permission requirements in unique project scenarios may not be met by these methods alone. Therefore, the Steedos permission engine also incorporates beforeFind triggers, which allow personalized and more advanced permission issues to be addressed through code."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a845cc02.10380777.js b/assets/js/a845cc02.10380777.js deleted file mode 100644 index 597ef9b24b..0000000000 --- a/assets/js/a845cc02.10380777.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[9911],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>g});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=r.createContext({}),l=function(e){var t=r.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=l(e.components);return r.createElement(p.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,p=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=o,g=u["".concat(p,".").concat(m)]||u[m]||d[m]||i;return n?r.createElement(g,a(a({ref:t},c),{},{components:n})):r.createElement(g,a({ref:t},c))}));function g(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=m;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s[u]="string"==typeof e?e:o,a[1]=s;for(var l=2;l{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>a,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=n(7462),o=(n(7294),n(3905));const i={title:"SSO API",description:"\u901a\u8fc7jwt\u5b9e\u73b0\u5916\u63a5\u5e94\u7528\u4e0e\u9b54\u65b9\u5e73\u53f0\u53cc\u5411\u5355\u70b9\u767b\u5f55\u3002"},a=void 0,s={unversionedId:"developer/api/api-jwt-sso",id:"developer/api/api-jwt-sso",title:"SSO API",description:"\u901a\u8fc7jwt\u5b9e\u73b0\u5916\u63a5\u5e94\u7528\u4e0e\u9b54\u65b9\u5e73\u53f0\u53cc\u5411\u5355\u70b9\u767b\u5f55\u3002",source:"@site/docs/developer/api/api-jwt-sso.mdx",sourceDirName:"developer/api",slug:"/developer/api/api-jwt-sso",permalink:"/developer/api/api-jwt-sso",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/developer/api/api-jwt-sso.mdx",tags:[],version:"current",frontMatter:{title:"SSO API",description:"\u901a\u8fc7jwt\u5b9e\u73b0\u5916\u63a5\u5e94\u7528\u4e0e\u9b54\u65b9\u5e73\u53f0\u53cc\u5411\u5355\u70b9\u767b\u5f55\u3002"},sidebar:"developer",previous:{title:"OpenAPI",permalink:"/developer/api/openapi"},next:{title:"Process API",permalink:"/developer/api/api-process"}},p={},l=[{value:"Logging into the Steedos from external applications.",id:"logging-into-the-steedos-from-external-applications",level:2},{value:"Preparation",id:"preparation",level:3},{value:"Next",id:"next",level:3},{value:"Example",id:"example",level:3},{value:"Login to External Applications via Steedos",id:"login-to-external-applications-via-steedos",level:2},{value:"Process Description",id:"process-description",level:3},{value:"Example",id:"example-1",level:3}],c={toc:l},u="wrapper";function d(e){let{components:t,...n}=e;return(0,o.kt)(u,(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"logging-into-the-steedos-from-external-applications"},"Logging into the Steedos from external applications."),(0,o.kt)("h3",{id:"preparation"},"Preparation"),(0,o.kt)("p",null,"1\u3001 Steedos needs to be configured with environment variables enabled for single sign-on. Add the following to the .env.local file:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-env"},"# JWT SSO\nSTEEDOS_IDENTITY_JWT_ENABLED=true\n")),(0,o.kt)("h3",{id:"next"},"Next"),(0,o.kt)("p",null,"1\u3001The external application generates a JWT in the custom server interface.\n2\u3001The external application redirects to Steedos interface using the following GET request: {root_url}/accounts/jwt/login?t={jwt}&redirect={redirectURL} to achieve single sign-on."),(0,o.kt)("h3",{id:"example"},"Example"),(0,o.kt)("p",null,"1\u3001To create a new application in Steedos, you need to specify an API name (e.g. finance) and an API key (e.g. app_api_secret)."),(0,o.kt)("p",null,"2\u3001The external application's frontend button calls the custom API (e.g. GET /api/get/token) to generate a JWT."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js"},"module.exports = {\n sso: function (object_name, record_id) {\n const getTokenURL = '/api/get/token'; \n\n const result = Steedos.authRequest(getTokenURL, {\n type: 'GET',\n async: false,\n contentType: 'application/json'\n });\n\n const token = result.token;\n const PLATFORM_ROOT_URL = 'https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io' \n window.open(`${PLATFORM_ROOT_URL}/accounts/jwt/login?t=${token}&redirect=${PLATFORM_ROOT_URL}`, '_blank') \n\n },\n ssoVisible: function () {\n return true\n }\n}\n")),(0,o.kt)("p",null,"3\u3001A custom server-side API needs to be implemented."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js"},"const express = require(\"express\");\nconst router = express.Router();\nconst core = require('@steedos/core');\nconst jwt = require('jsonwebtoken');\n\nrouter.get('/api/get/token', core.requireAuthentication, async function (req, res) {\n const userSession = req.user;\n\n var secret = 'app_api_secret' \n var options = { expiresIn: 30 } \n var token = jwt.sign({\n profile: {\n email: userSession.email \n },\n app_code: 'finance' \n }, secret, options);\n\n res.status(200).send({\n token: token\n });\n});\nexports.default = router;\n")),(0,o.kt)("h2",{id:"login-to-external-applications-via-steedos"},"Login to External Applications via Steedos"),(0,o.kt)("h3",{id:"process-description"},"Process Description"),(0,o.kt)("p",null,"1\u3001Create a new application in Steedos, specifying the external link and API key."),(0,o.kt)("p",null,'2\u3001Click on the external application in the launcher and redirect to the external link, passing the "t" parameter in the URL.'),(0,o.kt)("p",null,'3\u3001The external application parses the "t" parameter and redirects the user to the application.'),(0,o.kt)("h3",{id:"example-1"},"Example"),(0,o.kt)("p",null,"1\u3001Create a new application in Steedos and specify the external link (e.g. GET ",(0,o.kt)("a",{parentName:"p",href:"https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io/api/sso"},"https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io/api/sso"),") and API key (e.g. app_api_secret)."),(0,o.kt)("p",null,"2\u3001In the application launcher, click on the external application and you will be redirected to the external link."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js"},"https://5000-steedos-steedosprojectt-5apf195eq37.ws-us77.gitpod.io/api/sso?t=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvYmplY3RfbmFtZSI6InNwYWNlX3VzZXJzIiwiZG9jIjp7Il9pZCI6IkFGTkVuQ3hiU29HRWc0b2NmIiwibmFtZSI6Inh4eCIsInVzZXJuYW1lIjoieHh4eHh4IiwiZW1haWwiOiJzQHMuY29tIn0sImlhdCI6MTY2OTI2NjA0NiwiZXhwIjoxNjY5MjY5NjQ2fQ.qeld2kTl5zjLGjCWgk3cb6UPEPlqmzMaME20mo_t-t4\n")),(0,o.kt)("p",null,"3\u3001To parse the token in the external application"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js"},"const express = require(\"express\");\nconst router = express.Router();\nconst jwt = require('jsonwebtoken')\n\nrouter.get('/api/sso', async function (req, res) {\n console.log(req.query)\n // {\n // t: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvYmplY3RfbmFtZSI6InNwYWNlX3VzZXJzIiwiZG9jIjp7Il9pZCI6IkFGTkVuQ3hiU29HRWc0b2NmIiwibmFtZSI6Inh4eCIsInVzZXJuYW1lIjoieHh4eHh4IiwiZW1haWwiOiJzQHMuY29tIn0sImlhdCI6MTY2OTI2NjA0NiwiZXhwIjoxNjY5MjY5NjQ2fQ.qeld2kTl5zjLGjCWgk3cb6UPEPlqmzMaME20mo_t-t4'\n // }\n const payload = jwt.verify(req.query.t, 'app_api_secret') \n console.log(payload)\n // {\n // profile: {\n // name: 'xxx',\n // username: 'xxxxxx',\n // email: 's@s.com'\n // },\n // iat: 1669266046,\n // exp: 1669269646\n // }\n\n res.status(200).send({ message: 'router ok' });\n});\nexports.default = router;\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d5ff7109.7400cdfe.js b/assets/js/d5ff7109.7400cdfe.js new file mode 100644 index 0000000000..651b4d73c8 --- /dev/null +++ b/assets/js/d5ff7109.7400cdfe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[5471],{3905:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>f});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),l=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=l(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),u=l(r),m=o,f=u["".concat(s,".").concat(m)]||u[m]||p[m]||a;return r?n.createElement(f,i(i({ref:t},d),{},{components:r})):n.createElement(f,i({ref:t},d))}));function f(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c[u]="string"==typeof e?e:o,i[1]=c;for(var l=2;l{r.d(t,{Z:()=>g});var n=r(7294),o=r(6010),a=r(3438),i=r(9960),c=r(3919),s=r(5999);const l={cardContainer:"cardContainer_fWXF",cardTitle:"cardTitle_rnsV",cardDescription:"cardDescription_PWke"};function d(e){let{href:t,children:r}=e;return n.createElement(i.Z,{href:t,className:(0,o.Z)("card padding--lg",l.cardContainer)},r)}function u(e){let{href:t,icon:r,title:a,description:i}=e;return n.createElement(d,{href:t},n.createElement("h2",{className:(0,o.Z)("text--truncate",l.cardTitle),title:a},r," ",a),i&&n.createElement("p",{className:(0,o.Z)("text--truncate",l.cardDescription),title:i},i))}function p(e){let{item:t}=e;const r=(0,a.Wl)(t);return r?n.createElement(u,{href:r,icon:"\ud83d\uddc3\ufe0f",title:t.label,description:t.description??(0,s.I)({message:"{count} items",id:"theme.docs.DocCard.categoryDescription",description:"The default description for a category card in the generated index about how many items this category includes"},{count:t.items.length})}):null}function m(e){let{item:t}=e;const r=(0,c.Z)(t.href)?"\ud83d\udcc4\ufe0f":"\ud83d\udd17",o=(0,a.xz)(t.docId??void 0);return n.createElement(u,{href:t.href,icon:r,title:t.label,description:t.description??o?.description})}function f(e){let{item:t}=e;switch(t.type){case"link":return n.createElement(m,{item:t});case"category":return n.createElement(p,{item:t});default:throw new Error(`unknown item type ${JSON.stringify(t)}`)}}function y(e){let{className:t}=e;const r=(0,a.jA)();return n.createElement(g,{items:r.items,className:t})}function g(e){const{items:t,className:r}=e;if(!t)return n.createElement(y,e);const i=(0,a.MN)(t);return n.createElement("section",{className:(0,o.Z)("row",r)},i.map(((e,t)=>n.createElement("article",{key:t,className:"col col--6 margin-bottom--lg"},n.createElement(f,{item:e})))))}},5911:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>c,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var n=r(7462),o=(r(7294),r(3905)),a=r(2991);const i={sidebar_label:"Integration"},c="Extend the Reach of Your Organization",s={unversionedId:"developer/integration/README",id:"developer/integration/README",title:"Extend the Reach of Your Organization",description:"Sometimes your users need to work with data and services that are outside your Steedos org. There\u2019s a variety of ways you can provide seamless access across org boundaries.",source:"@site/docs/developer/integration/README.md",sourceDirName:"developer/integration",slug:"/developer/integration/",permalink:"/developer/integration/",draft:!1,editUrl:"https://github.com/steedos/steedos-docs/tree/master/docs/developer/integration/README.md",tags:[],version:"current",frontMatter:{sidebar_label:"Integration"},sidebar:"developer",previous:{title:"Process API",permalink:"/developer/api/api-process"},next:{title:"SSO API",permalink:"/developer/integration/api-jwt-sso"}},l={},d=[],u={toc:d},p="wrapper";function m(e){let{components:t,...r}=e;return(0,o.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"extend-the-reach-of-your-organization"},"Extend the Reach of Your Organization"),(0,o.kt)("p",null,"Sometimes your users need to work with data and services that are outside your Steedos org. There\u2019s a variety of ways you can provide seamless access across org boundaries."),(0,o.kt)(a.Z,{mdxType:"DocCardList"}))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.4feec75e.js b/assets/js/main.4feec75e.js deleted file mode 100644 index 382b34ae34..0000000000 --- a/assets/js/main.4feec75e.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.4feec75e.js.LICENSE.txt */ -(self.webpackChunkmy_website=self.webpackChunkmy_website||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),s=n(6887);const l={"01711fe9":[()=>n.e(2377).then(n.bind(n,4362)),"@site/docs/developer/micro-page/components/record_detail_header.mdx",4362],"044da7cb":[()=>n.e(2096).then(n.bind(n,3254)),"@site/docs/no-code/customize/fields/field-types.md",3254],"07283571":[()=>n.e(8581).then(n.bind(n,5353)),"@site/docs/deploy/gitpod.md",5353],"090c40b9":[()=>n.e(8546).then(n.bind(n,2096)),"@site/docs/apps/customer-relationship-management/sales/README.md",2096],"09c69199":[()=>Promise.all([n.e(532),n.e(2084)]).then(n.bind(n,7165)),"@site/docs/admin/permissions/index.md",7165],"0a3e8858":[()=>n.e(3014).then(n.bind(n,8213)),"@site/docs/admin/permissions/sharing-rules.md",8213],"0ac7a4a6":[()=>n.e(2845).then(n.bind(n,435)),"@site/docs/developer/package/metadata/README.md",435],"0c1aed26":[()=>n.e(5256).then(n.bind(n,2898)),"@site/docs/developer/micro-page/components/record_detail_related_list.mdx",2898],"0de79637":[()=>n.e(4740).then(n.bind(n,1687)),"@site/docs/apps/human-capital-management/performance/README.md",1687],"0f1802bd":[()=>n.e(6343).then(n.bind(n,8728)),"@site/docs/admin/organization/users.md",8728],"105b9593":[()=>n.e(6482).then(n.bind(n,4282)),"@site/docs/developer/service/locale.mdx",4282],"108d513c":[()=>n.e(1215).then(n.bind(n,3677)),"@site/docs/apps/human-capital-management/attendance/README.md",3677],"10d4841d":[()=>n.e(4941).then(n.bind(n,4977)),"@site/docs/admin/permissions/overview.md",4977],"11550d7d":[()=>n.e(5675).then(n.bind(n,9582)),"@site/docs/apps/collaboration/milestone/README.md",9582],"125d8b5f":[()=>n.e(9062).then(n.bind(n,7047)),"@site/docs/developer/api/openapi.mdx",7047],"13a1bdd1":[()=>n.e(2441).then(n.bind(n,6915)),"@site/docs/developer/package/metadata/metadata-automation.md",6915],"14bc808c":[()=>n.e(7673).then(n.bind(n,4306)),"@site/docs/developer/package/package-publish.md",4306],"15bce9af":[()=>n.e(2287).then(n.bind(n,1208)),"@site/docs/developer/micro-page/amis/7_event.md",1208],17896441:[()=>Promise.all([n.e(532),n.e(5277),n.e(7918)]).then(n.bind(n,8945)),"@theme/DocItem",8945],"18a20e7a":[()=>n.e(8973).then(n.bind(n,7295)),"@site/docs/admin/organization/organizations.md",7295],"1923c08a":[()=>Promise.all([n.e(532),n.e(8631)]).then(n.bind(n,8101)),"@site/docs/apps/spend-management/README.md",8101],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,1473)),"@theme/SearchPage",1473],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1e65a6b8":[()=>Promise.all([n.e(532),n.e(6088)]).then(n.bind(n,637)),"@site/docs/no-code/customize/README.md",637],"1f7b859f":[()=>n.e(1859).then(n.t.bind(n,5745,19)),"/home/runner/work/steedos-docs/steedos-docs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"2316603e":[()=>n.e(379).then(n.bind(n,3590)),"@site/docs/admin/permissions/profile.md",3590],"2331e69c":[()=>n.e(3182).then(n.bind(n,7444)),"@site/blog/2023-06-12-welcome.md?truncated=true",7444],"27d5d85f":[()=>n.e(9901).then(n.bind(n,1436)),"@site/docs/developer/setup/create-steedos-app.mdx",1436],"294ac9d5":[()=>n.e(8856).then(n.bind(n,4953)),"@site/docs/plugins.md",4953],"2b5d5775":[()=>n.e(2884).then(n.bind(n,1273)),"@site/docs/developer/api/graphql-api.mdx",1273],"2e0007ce":[()=>n.e(603).then(n.bind(n,3598)),"@site/docs/developer/micro-page/overview.md",3598],"31eb4776":[()=>n.e(8253).then(n.bind(n,2223)),"@site/docs/developer/service/moleculer/events.md",2223],"331cc114":[()=>n.e(4068).then(n.bind(n,9228)),"@site/docs/developer/package/package-install.md",9228],"350c64aa":[()=>Promise.all([n.e(532),n.e(94)]).then(n.bind(n,1021)),"@site/docs/developer/micro-page/README.md",1021],"351c7f79":[()=>n.e(2901).then(n.bind(n,4903)),"@site/docs/developer/setup/steedos-cli.md",4903],"3573e262":[()=>n.e(3947).then(n.bind(n,8399)),"@site/docs/developer/micro-page/amis/1_base_config.md",8399],"364bd72e":[()=>n.e(208).then(n.bind(n,8296)),"@site/docs/developer/package/overview.md",8296],"3a9e3985":[()=>n.e(5353).then(n.bind(n,7523)),"@site/docs/no-code/customize/formula/datetime.md",7523],"3deda2ed":[()=>n.e(1592).then(n.bind(n,596)),"@site/docs/developer/micro-page/components/object_listview.mdx",596],"3e15da37":[()=>Promise.all([n.e(532),n.e(8377)]).then(n.bind(n,273)),"@site/docs/no-code/customize/formula/README.md",273],"4049712b":[()=>n.e(2135).then(n.bind(n,4876)),"@site/docs/no-code/application/overview.md",4876],"40aa4c47":[()=>n.e(8636).then(n.bind(n,3747)),"@site/docs/developer/service/action-api.mdx",3747],"439a9a13":[()=>n.e(4523).then(n.bind(n,6147)),"@site/docs/developer/micro-page/components/object_table.mdx",6147],44729934:[()=>n.e(8587).then(n.bind(n,800)),"@site/docs/developer/package/metadata/metadata-permissions.md",800],"465a2687":[()=>n.e(5496).then(n.bind(n,729)),"@site/docs/developer/micro-page/amis/4_data_mapping.md",729],"484f91df":[()=>n.e(5204).then(n.bind(n,5346)),"@site/docs/no-code/customize/object.md",5346],"4850e5d6":[()=>n.e(8440).then(n.bind(n,5963)),"@site/docs/no-code/application/app.md",5963],"49de03b4":[()=>n.e(7970).then(n.bind(n,7276)),"@site/docs/no-code.md",7276],"4a34ebd0":[()=>n.e(2218).then(n.bind(n,8922)),"@site/docs/integration/external-datasources.md",8922],"4af662f6":[()=>n.e(7188).then(n.bind(n,8107)),"@site/docs/no-code/customize/formula/formula-field.md",8107],"4bccbb93":[()=>Promise.all([n.e(532),n.e(2126)]).then(n.bind(n,3734)),"@site/docs/getting-started/tutorials/README.md",3734],"4e6634d7":[()=>n.e(1676).then(n.bind(n,4187)),"@site/docs/apps/customer-relationship-management/service/README.md",4187],"50542fd6":[()=>n.e(2415).then(n.bind(n,7020)),"@site/docs/developer/service/package-service.md",7020],"51c8b7ad":[()=>n.e(6322).then(n.bind(n,7744)),"@site/docs/admin/organization/audit-logs.md",7744],"53daad5c":[()=>n.e(8338).then(n.t.bind(n,4469,19)),"/home/runner/work/steedos-docs/steedos-docs/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],"54155afb":[()=>n.e(8598).then(n.bind(n,6812)),"@site/docs/developer/service/overview.md",6812],"544321e5":[()=>Promise.all([n.e(532),n.e(1929)]).then(n.bind(n,1833)),"@site/docs/developer/api/README.md",1833],"54f2501d":[()=>n.e(200).then(n.bind(n,3582)),"@site/docs/no-code/customize/button.mdx",3582],"55d2ff4d":[()=>n.e(4364).then(n.bind(n,3206)),"@site/docs/automation/automated-actions.md",3206],"580f21e1":[()=>n.e(1386).then(n.bind(n,6710)),"@site/docs/developer/micro-page/getting_start.md",6710],"59df44d0":[()=>n.e(4820).then(n.bind(n,2596)),"@site/docs/automation/approval-king/admin-guide.mdx",2596],"5a006fda":[()=>n.e(2380).then(n.bind(n,1182)),"@site/docs/no-code/customize/formula/cross-object.md",1182],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"605b7772":[()=>n.e(8909).then(n.bind(n,6614)),"@site/docs/admin.md",6614],"6090f73a":[()=>n.e(6653).then(n.bind(n,4780)),"@site/docs/developer/service/service-api/service-graphql.mdx",4780],"621a0482":[()=>n.e(8031).then(n.bind(n,196)),"@site/docs/no-code/customize/validation-rules.md",196],"62cc1630":[()=>n.e(1314).then(n.bind(n,3568)),"@site/docs/developer/package/metadata/metadata-ui.md",3568],"659b4b7e":[()=>n.e(1015).then(n.bind(n,7761)),"@site/docs/developer/setup/sample-repository.md",7761],67661274:[()=>Promise.all([n.e(532),n.e(7944)]).then(n.bind(n,765)),"@site/docs/getting-started/user/README.md",765],"67dbbd4a":[()=>n.e(7773).then(n.bind(n,3168)),"@site/docs/plugins/integration-qywx.mdx",3168],"67ee2037":[()=>n.e(5524).then(n.bind(n,741)),"@site/docs/admin/permissions/object-permissions.md",741],"691a0624":[()=>n.e(1914).then(n.bind(n,9459)),"@site/docs/automation/approval-process.md",9459],"696433bf":[()=>n.e(6070).then(n.bind(n,8290)),"@site/docs/automation/workflow-rules.md",8290],"698ff3f3":[()=>n.e(5683).then(n.bind(n,2928)),"@site/docs/developer/api/overview.md",2928],"6b75262e":[()=>Promise.all([n.e(532),n.e(3336)]).then(n.bind(n,4803)),"@site/docs/no-code/customize/fields/README.md",4803],"6c663008":[()=>n.e(2805).then(n.bind(n,2925)),"@site/docs/developer/package/sync-metadata.md",2925],"6cc3ce97":[()=>n.e(5462).then(n.bind(n,2417)),"@site/docs/getting-started/tutorials/the-basics/3.app.md",2417],"6d98e5d9":[()=>n.e(742).then(n.bind(n,7338)),"@site/docs/admin/organization/installed-packages.md",7338],"6fac5e22":[()=>n.e(6915).then(n.bind(n,9877)),"@site/docs/developer/micro-page/custom_components.md",9877],"70c033e6":[()=>Promise.all([n.e(532),n.e(1786)]).then(n.bind(n,2247)),"@site/docs/admin/organization/README.md",2247],"7920944a":[()=>Promise.all([n.e(532),n.e(9512)]).then(n.bind(n,2089)),"@site/docs/developer/package/README.md",2089],"7978bac7":[()=>n.e(6928).then(n.bind(n,1657)),"@site/docs/plugins/integration-ding.mdx",1657],"7a331794":[()=>n.e(8281).then(n.bind(n,4600)),"@site/docs/no-code/customize/listview.md",4600],"7bb613f8":[()=>n.e(5620).then(n.bind(n,3545)),"@site/docs/developer/service/service-api/service-sms.mdx",3545],"7bdff2b2":[()=>n.e(9201).then(n.bind(n,1385)),"@site/docs/developer/service/service-api/service-push.mdx",1385],"7d6e9cc6":[()=>n.e(4961).then(n.bind(n,9158)),"@site/docs/integration/node-red.mdx",9158],"7f2d198a":[()=>n.e(7897).then(n.bind(n,9607)),"@site/docs/admin/organization/white-label.md",9607],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],"86704b8a":[()=>n.e(4954).then(n.bind(n,2861)),"@site/docs/no-code/application/tab.md",2861],"8a2a12a4":[()=>n.e(8091).then(n.bind(n,1275)),"@site/docs/admin/permissions/app-permissions.md",1275],"8ac6c91e":[()=>n.e(2185).then(n.bind(n,4798)),"@site/docs/developer/service/moleculer/repl.md",4798],"8afe63b8":[()=>n.e(8110).then(n.bind(n,5847)),"@site/docs/apps/spend-management/contract/README.md",5847],"8cb7c1e6":[()=>n.e(2354).then(n.bind(n,2913)),"@site/docs/getting-started/tutorials/the-basics/1.object.md",2913],"8ef82481":[()=>Promise.all([n.e(532),n.e(442)]).then(n.bind(n,8489)),"@site/docs/integration.md",8489],"8f258033":[()=>n.e(5422).then(n.bind(n,3433)),"@site/docs/developer/service/action-trigger.mdx",3433],"9033d33d":[()=>n.e(7e3).then(n.bind(n,9111)),"@site/docs/no-code/customize/object-relationship.md",9111],"90c775f7":[()=>n.e(431).then(n.bind(n,2808)),"@site/docs/developer/micro-page/amis/2_data.md",2808],"90d5c376":[()=>n.e(770).then(n.bind(n,7488)),"@site/docs/deploy/steedos-config.md",7488],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93d6fe64":[()=>n.e(4994).then(n.bind(n,5235)),"@site/docs/developer/setup/overview.md",5235],"952b7352":[()=>n.e(7150).then(n.bind(n,7983)),"@site/docs/developer/api/api-process.mdx",7983],"974bf0e4":[()=>Promise.all([n.e(532),n.e(8156)]).then(n.bind(n,26)),"@site/docs/automation.md",26],"98518e1e":[()=>n.e(6894).then(n.t.bind(n,2776,19)),"/home/runner/work/steedos-docs/steedos-docs/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",2776],"98743f3f":[()=>Promise.all([n.e(532),n.e(1764)]).then(n.bind(n,2895)),"@site/docs/deploy/deploy-docker.md",2895],"98e1679c":[()=>n.e(1273).then(n.bind(n,8666)),"@site/docs/admin/permissions/before-find.md",8666],"99e04881":[()=>Promise.all([n.e(532),n.e(6025)]).then(n.bind(n,5637)),"@site/docs/deploy.md",5637],"9b3ef690":[()=>n.e(7386).then(n.bind(n,6331)),"@site/docs/apps/collaboration/approval-king/README.md",6331],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],"9f4682ef":[()=>n.e(7314).then(n.bind(n,7183)),"@site/docs/apps/spend-management/invoice/README.md",7183],"9ff1a4ec":[()=>n.e(9772).then(n.bind(n,7949)),"@site/docs/developer/service/moleculer/actions.md",7949],a2135033:[()=>n.e(7641).then(n.bind(n,1903)),"@site/docs/getting-started/README.md",1903],a4aa70a1:[()=>n.e(9292).then(n.bind(n,5217)),"@site/docs/no-code/customize/page-layout.md",5217],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(5277),n.e(6048),n.e(3089)]).then(n.bind(n,3269)),"@theme/BlogListPage",3269],a845cc02:[()=>n.e(9911).then(n.bind(n,3100)),"@site/docs/developer/api/api-jwt-sso.mdx",3100],abe1faf8:[()=>n.e(3785).then(n.bind(n,259)),"@site/docs/apps/customer-relationship-management/README.md",259],ac076fe0:[()=>n.e(7756).then(n.bind(n,4620)),"@site/docs/admin/organization/company-info.md",4620],ac188f15:[()=>Promise.all([n.e(532),n.e(2350)]).then(n.bind(n,3232)),"@site/docs/getting-started/tutorials/the-basics/README.md",3232],adf4dadf:[()=>n.e(1034).then(n.bind(n,491)),"@site/docs/apps/spend-management/expense/README.md",491],ae59ad3d:[()=>n.e(413).then(n.bind(n,4138)),"@site/docs/no-code/customize/fields/relationship.md",4138],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b33224a6:[()=>n.e(2171).then(n.bind(n,2487)),"@site/docs/developer/package/metadata/metadata-object.md",2487],b49814d6:[()=>n.e(934).then(n.bind(n,8633)),"@site/docs/developer/micro-page/amis/5_expression.md",8633],b6ca1fa7:[()=>n.e(9200).then(n.bind(n,6166)),"@site/docs/developer.md",6166],b9e8b178:[()=>n.e(281).then(n.bind(n,8604)),"@site/docs/getting-started/user/overview.md",8604],bb9aa77a:[()=>n.e(5664).then(n.bind(n,1595)),"@site/docs/apps/spend-management/tender/README.md",1595],bebe392c:[()=>n.e(4424).then(n.t.bind(n,3769,19)),"/home/runner/work/steedos-docs/steedos-docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],c027946d:[()=>n.e(9476).then(n.bind(n,4189)),"@site/docs/developer/micro-page/amis/6_linkage.md",4189],c06d31f1:[()=>n.e(5276).then(n.bind(n,7824)),"@site/docs/no-code/customize/formula/functions.md",7824],c17dbeec:[()=>n.e(4017).then(n.bind(n,8516)),"@site/docs/developer/micro-page/amis/README.md",8516],c2bfcc39:[()=>Promise.all([n.e(532),n.e(3166)]).then(n.bind(n,267)),"@site/docs/no-code/application/README.md",267],c444e4c1:[()=>n.e(5721).then(n.bind(n,5058)),"@site/docs/no-code/customize/fields/field-attributes.md",5058],c4f5d8e4:[()=>n.e(4195).then(n.bind(n,2841)),"@site/src/pages/index.js",2841],c5f5010c:[()=>n.e(8479).then(n.bind(n,1192)),"@site/docs/admin/permissions/field-permissions.md",1192],c63f9f7f:[()=>n.e(8077).then(n.bind(n,1928)),"@site/docs/admin/organization/import.md",1928],c6af847f:[()=>n.e(2066).then(n.bind(n,7431)),"@site/docs/deploy/intranet.md",7431],c6f2a093:[()=>n.e(7198).then(n.bind(n,7046)),"@site/docs/developer/micro-page/components/object_form.mdx",7046],cb3babc3:[()=>n.e(1393).then(n.bind(n,6615)),"@site/docs/developer/api/api-validate.mdx",6615],cbca34bf:[()=>n.e(3827).then(n.bind(n,4569)),"@site/docs/admin/permissions/restriction-rules.md",4569],ccc49370:[()=>Promise.all([n.e(532),n.e(5277),n.e(6048),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],ccf3b376:[()=>n.e(7177).then(n.bind(n,8401)),"@site/docs/admin/permissions/permission-set.md",8401],cdc5ab0a:[()=>n.e(2863).then(n.bind(n,5536)),"@site/docs/developer/service/objectql.md",5536],cf02134c:[()=>n.e(5019).then(n.bind(n,989)),"@site/docs/getting-started/tutorials/the-basics/2.relationship.md",989],d212565e:[()=>n.e(2389).then(n.bind(n,7303)),"@site/docs/developer/service/moleculer/README.md",7303],d8066f24:[()=>n.e(4151).then(n.bind(n,7789)),"@site/docs/developer/setup/project-start.md",7789],d81c96fd:[()=>n.e(2023).then(n.bind(n,1587)),"@site/docs/developer/micro-page/components/README.mdx",1587],d8313741:[()=>Promise.all([n.e(532),n.e(6837)]).then(n.bind(n,6460)),"@site/docs/developer/setup/README.md",6460],d9a60390:[()=>n.e(4419).then(n.bind(n,3372)),"@site/docs/no-code/application/pages.mdx",3372],dac5e083:[()=>Promise.all([n.e(532),n.e(2110)]).then(n.bind(n,3198)),"@site/docs/apps/human-capital-management/README.md",3198],dd0ca06d:[()=>n.e(8887).then(n.bind(n,3764)),"@site/docs/no-code/customize/fields/field-type-autonumber.md",3764],dd79ccd7:[()=>n.e(4145).then(n.bind(n,7372)),"@site/docs/apps/human-capital-management/employee/README.md",7372],de05ab7b:[()=>n.e(3082).then(n.bind(n,542)),"@site/docs/getting-started/user/download-apps.md",542],e4392c73:[()=>n.e(9183).then(n.bind(n,5449)),"@site/docs/no-code/customize/fields/field-type-summary.md",5449],e46f647e:[()=>n.e(8181).then(n.bind(n,3527)),"@site/docs/automation/approval-king/getting-started.mdx",3527],e5bef654:[()=>n.e(4884).then(n.bind(n,3134)),"@site/docs/automation/approval-king/index.md",3134],edea0348:[()=>Promise.all([n.e(532),n.e(6534)]).then(n.bind(n,4649)),"@site/docs/apps/collaboration/README.md",4649],ee481441:[()=>Promise.all([n.e(532),n.e(9157)]).then(n.bind(n,6823)),"@site/docs/developer/service/README.md",6823],f1a9d87a:[()=>n.e(6382).then(n.bind(n,5251)),"@site/docs/apps/spend-management/project/README.md",5251],f28457a1:[()=>n.e(6008).then(n.bind(n,5572)),"@site/docs/apps/getting-started/overview.md",5572],f364f869:[()=>n.e(1467).then(n.bind(n,933)),"@site/docs/getting-started/tutorials/the-basics/4.workflow-rules.md",933],f398169f:[()=>n.e(7090).then(n.bind(n,8867)),"@site/docs/apps/spend-management/supplier/README.md",8867],f4bcf52e:[()=>n.e(4629).then(n.bind(n,9145)),"@site/docs/developer/service/service-api/README.md",9145],f7d1a54b:[()=>n.e(9107).then(n.bind(n,7759)),"@site/docs/apps/getting-started/deploy.md",7759],f8c4078a:[()=>n.e(2481).then(n.bind(n,9362)),"@site/docs/developer/micro-page/amis/3_tpl.md",9362],fc99e39a:[()=>n.e(5299).then(n.bind(n,8295)),"@site/docs/no-code/customize/formula/overview.md",8295],fd11e1f8:[()=>n.e(4407).then(n.bind(n,6647)),"@site/blog/2023-06-12-welcome.md",6647],fee9f0a5:[()=>n.e(398).then(n.bind(n,1499)),"@site/docs/developer/micro-page/amis/8_styles.md",1499],ff17aaf2:[()=>n.e(3116).then(n.bind(n,6491)),"@site/docs/admin/permissions/division.md",6491]};function c(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(9670),d=n(226);function p(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=s[`${e}-${t}`],p={},f=[],m=[],h=(0,u.Z)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=l[n];r&&(p[t]=r[0],f.push(r[1]),m.push(r[2]))})),i().Map({loading:c,loader:p,modules:f,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const s=n.split(".");s.slice(0,-1).forEach((e=>{o=o[e]})),o[s[s.length-1]]=a}));const s=i.__comp;delete i.__comp;const l=i.__context;return delete i.__context,r.createElement(d.z,{value:l},r.createElement(s,(0,a.Z)({},i,n)))}})}const f=[{path:"/blog",component:p("/blog","970"),exact:!0},{path:"/blog/archive",component:p("/blog/archive","79e"),exact:!0},{path:"/blog/welcome",component:p("/blog/welcome","132"),exact:!0},{path:"/search",component:p("/search","ade"),exact:!0},{path:"/",component:p("/","509"),exact:!0},{path:"/",component:p("/","42c"),routes:[{path:"/admin",component:p("/admin","ae6"),exact:!0},{path:"/admin/organization/",component:p("/admin/organization/","028"),exact:!0,sidebar:"platform"},{path:"/admin/organization/audit-logs",component:p("/admin/organization/audit-logs","ac1"),exact:!0,sidebar:"platform"},{path:"/admin/organization/company-info",component:p("/admin/organization/company-info","2b5"),exact:!0,sidebar:"platform"},{path:"/admin/organization/import",component:p("/admin/organization/import","808"),exact:!0,sidebar:"platform"},{path:"/admin/organization/installed-packages",component:p("/admin/organization/installed-packages","e8e"),exact:!0,sidebar:"platform"},{path:"/admin/organization/organizations",component:p("/admin/organization/organizations","9db"),exact:!0,sidebar:"platform"},{path:"/admin/organization/users",component:p("/admin/organization/users","8ba"),exact:!0,sidebar:"platform"},{path:"/admin/organization/white-label",component:p("/admin/organization/white-label","bd2"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/",component:p("/admin/permissions/","1ae"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/app-permissions",component:p("/admin/permissions/app-permissions","bb4"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/before-find",component:p("/admin/permissions/before-find","e61"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/division",component:p("/admin/permissions/division","c45"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/field-permissions",component:p("/admin/permissions/field-permissions","eb7"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/object-permissions",component:p("/admin/permissions/object-permissions","81c"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/overview",component:p("/admin/permissions/overview","03c"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/permission-set",component:p("/admin/permissions/permission-set","501"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/profile",component:p("/admin/permissions/profile","cd6"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/restriction-rules",component:p("/admin/permissions/restriction-rules","16f"),exact:!0,sidebar:"platform"},{path:"/admin/permissions/sharing-rules",component:p("/admin/permissions/sharing-rules","340"),exact:!0,sidebar:"platform"},{path:"/apps/collaboration/",component:p("/apps/collaboration/","234"),exact:!0,sidebar:"apps"},{path:"/apps/collaboration/approval-king/",component:p("/apps/collaboration/approval-king/","edc"),exact:!0,sidebar:"apps"},{path:"/apps/collaboration/milestone/",component:p("/apps/collaboration/milestone/","19f"),exact:!0,sidebar:"apps"},{path:"/apps/customer-relationship-management/",component:p("/apps/customer-relationship-management/","10b"),exact:!0,sidebar:"apps"},{path:"/apps/customer-relationship-management/sales/",component:p("/apps/customer-relationship-management/sales/","314"),exact:!0,sidebar:"apps"},{path:"/apps/customer-relationship-management/service/",component:p("/apps/customer-relationship-management/service/","d20"),exact:!0,sidebar:"apps"},{path:"/apps/getting-started/deploy",component:p("/apps/getting-started/deploy","3c5"),exact:!0,sidebar:"apps"},{path:"/apps/getting-started/overview",component:p("/apps/getting-started/overview","077"),exact:!0,sidebar:"apps"},{path:"/apps/human-capital-management/",component:p("/apps/human-capital-management/","b21"),exact:!0,sidebar:"apps"},{path:"/apps/human-capital-management/attendance/",component:p("/apps/human-capital-management/attendance/","6e4"),exact:!0,sidebar:"apps"},{path:"/apps/human-capital-management/employee/",component:p("/apps/human-capital-management/employee/","329"),exact:!0,sidebar:"apps"},{path:"/apps/human-capital-management/performance/",component:p("/apps/human-capital-management/performance/","071"),exact:!0,sidebar:"apps"},{path:"/apps/spend-management/",component:p("/apps/spend-management/","8de"),exact:!0,sidebar:"apps"},{path:"/apps/spend-management/contract/",component:p("/apps/spend-management/contract/","bf9"),exact:!0,sidebar:"apps"},{path:"/apps/spend-management/expense/",component:p("/apps/spend-management/expense/","c39"),exact:!0,sidebar:"apps"},{path:"/apps/spend-management/invoice/",component:p("/apps/spend-management/invoice/","7f7"),exact:!0,sidebar:"apps"},{path:"/apps/spend-management/project/",component:p("/apps/spend-management/project/","aac"),exact:!0,sidebar:"apps"},{path:"/apps/spend-management/supplier/",component:p("/apps/spend-management/supplier/","f48"),exact:!0,sidebar:"apps"},{path:"/apps/spend-management/tender/",component:p("/apps/spend-management/tender/","9ea"),exact:!0,sidebar:"apps"},{path:"/automation",component:p("/automation","b61"),exact:!0,sidebar:"platform"},{path:"/automation/approval-king/",component:p("/automation/approval-king/","90a"),exact:!0,sidebar:"platform"},{path:"/automation/approval-king/admin-guide",component:p("/automation/approval-king/admin-guide","722"),exact:!0,sidebar:"platform"},{path:"/automation/approval-king/getting-started",component:p("/automation/approval-king/getting-started","d07"),exact:!0,sidebar:"platform"},{path:"/automation/approval-process",component:p("/automation/approval-process","2af"),exact:!0,sidebar:"platform"},{path:"/automation/automated-actions",component:p("/automation/automated-actions","bd0"),exact:!0,sidebar:"platform"},{path:"/automation/workflow-rules",component:p("/automation/workflow-rules","64b"),exact:!0,sidebar:"platform"},{path:"/deploy",component:p("/deploy","53e"),exact:!0,sidebar:"platform"},{path:"/deploy/deploy-docker",component:p("/deploy/deploy-docker","29a"),exact:!0,sidebar:"platform"},{path:"/deploy/gitpod",component:p("/deploy/gitpod","76e"),exact:!0,sidebar:"platform"},{path:"/deploy/intranet",component:p("/deploy/intranet","6dc"),exact:!0,sidebar:"platform"},{path:"/deploy/steedos-config",component:p("/deploy/steedos-config","d26"),exact:!0,sidebar:"platform"},{path:"/developer",component:p("/developer","9bb"),exact:!0,sidebar:"developer"},{path:"/developer/api/",component:p("/developer/api/","006"),exact:!0,sidebar:"developer"},{path:"/developer/api/api-jwt-sso",component:p("/developer/api/api-jwt-sso","476"),exact:!0,sidebar:"developer"},{path:"/developer/api/api-process",component:p("/developer/api/api-process","a28"),exact:!0,sidebar:"developer"},{path:"/developer/api/api-validate",component:p("/developer/api/api-validate","652"),exact:!0,sidebar:"developer"},{path:"/developer/api/graphql-api",component:p("/developer/api/graphql-api","478"),exact:!0,sidebar:"developer"},{path:"/developer/api/openapi",component:p("/developer/api/openapi","f3a"),exact:!0,sidebar:"developer"},{path:"/developer/api/overview",component:p("/developer/api/overview","5ec"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/",component:p("/developer/micro-page/","be5"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/amis/",component:p("/developer/micro-page/amis/","9be"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/amis/base_config",component:p("/developer/micro-page/amis/base_config","7f4"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/amis/data",component:p("/developer/micro-page/amis/data","c93"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/amis/data_mapping",component:p("/developer/micro-page/amis/data_mapping","e92"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/amis/event",component:p("/developer/micro-page/amis/event","a67"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/amis/expression",component:p("/developer/micro-page/amis/expression","929"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/amis/linkage",component:p("/developer/micro-page/amis/linkage","db7"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/amis/styles",component:p("/developer/micro-page/amis/styles","c89"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/amis/tpl",component:p("/developer/micro-page/amis/tpl","fe2"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/components/",component:p("/developer/micro-page/components/","32e"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/components/object_form",component:p("/developer/micro-page/components/object_form","23d"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/components/object_listview",component:p("/developer/micro-page/components/object_listview","2a5"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/components/object_table",component:p("/developer/micro-page/components/object_table","aab"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/components/record_detail_header",component:p("/developer/micro-page/components/record_detail_header","b61"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/components/record_detail_related_list",component:p("/developer/micro-page/components/record_detail_related_list","cd4"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/custom_components",component:p("/developer/micro-page/custom_components","f4c"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/getting_start",component:p("/developer/micro-page/getting_start","c3a"),exact:!0,sidebar:"developer"},{path:"/developer/micro-page/overview",component:p("/developer/micro-page/overview","ea4"),exact:!0,sidebar:"developer"},{path:"/developer/package/",component:p("/developer/package/","4fd"),exact:!0,sidebar:"developer"},{path:"/developer/package/metadata/",component:p("/developer/package/metadata/","615"),exact:!0,sidebar:"developer"},{path:"/developer/package/metadata/metadata-automation",component:p("/developer/package/metadata/metadata-automation","7a5"),exact:!0,sidebar:"developer"},{path:"/developer/package/metadata/metadata-object",component:p("/developer/package/metadata/metadata-object","6ab"),exact:!0,sidebar:"developer"},{path:"/developer/package/metadata/metadata-permissions",component:p("/developer/package/metadata/metadata-permissions","f00"),exact:!0,sidebar:"developer"},{path:"/developer/package/metadata/metadata-ui",component:p("/developer/package/metadata/metadata-ui","a4d"),exact:!0,sidebar:"developer"},{path:"/developer/package/overview",component:p("/developer/package/overview","ee8"),exact:!0,sidebar:"developer"},{path:"/developer/package/package-install",component:p("/developer/package/package-install","ebe"),exact:!0,sidebar:"developer"},{path:"/developer/package/package-publish",component:p("/developer/package/package-publish","127"),exact:!0,sidebar:"developer"},{path:"/developer/package/sync-metadata",component:p("/developer/package/sync-metadata","e3a"),exact:!0,sidebar:"developer"},{path:"/developer/service/",component:p("/developer/service/","277"),exact:!0,sidebar:"developer"},{path:"/developer/service/action-api",component:p("/developer/service/action-api","f36"),exact:!0,sidebar:"developer"},{path:"/developer/service/action-trigger",component:p("/developer/service/action-trigger","eab"),exact:!0,sidebar:"developer"},{path:"/developer/service/locale",component:p("/developer/service/locale","664"),exact:!0,sidebar:"developer"},{path:"/developer/service/moleculer/",component:p("/developer/service/moleculer/","b84"),exact:!0,sidebar:"developer"},{path:"/developer/service/moleculer/actions",component:p("/developer/service/moleculer/actions","61a"),exact:!0,sidebar:"developer"},{path:"/developer/service/moleculer/events",component:p("/developer/service/moleculer/events","d15"),exact:!0,sidebar:"developer"},{path:"/developer/service/moleculer/repl",component:p("/developer/service/moleculer/repl","f0a"),exact:!0,sidebar:"developer"},{path:"/developer/service/objectql",component:p("/developer/service/objectql","8e3"),exact:!0,sidebar:"developer"},{path:"/developer/service/overview",component:p("/developer/service/overview","8ae"),exact:!0,sidebar:"developer"},{path:"/developer/service/package-service",component:p("/developer/service/package-service","b46"),exact:!0,sidebar:"developer"},{path:"/developer/service/service-api/",component:p("/developer/service/service-api/","fbe"),exact:!0,sidebar:"developer"},{path:"/developer/service/service-api/service-graphql",component:p("/developer/service/service-api/service-graphql","64f"),exact:!0,sidebar:"developer"},{path:"/developer/service/service-api/service-push",component:p("/developer/service/service-api/service-push","423"),exact:!0,sidebar:"developer"},{path:"/developer/service/service-api/service-sms",component:p("/developer/service/service-api/service-sms","ba0"),exact:!0,sidebar:"developer"},{path:"/developer/setup/",component:p("/developer/setup/","b85"),exact:!0,sidebar:"developer"},{path:"/developer/setup/create-steedos-app",component:p("/developer/setup/create-steedos-app","03a"),exact:!0,sidebar:"developer"},{path:"/developer/setup/overview",component:p("/developer/setup/overview","2d2"),exact:!0,sidebar:"developer"},{path:"/developer/setup/project-start",component:p("/developer/setup/project-start","697"),exact:!0,sidebar:"developer"},{path:"/developer/setup/sample-repository",component:p("/developer/setup/sample-repository","cbc"),exact:!0,sidebar:"developer"},{path:"/developer/setup/steedos-cli",component:p("/developer/setup/steedos-cli","456"),exact:!0,sidebar:"developer"},{path:"/getting-started/",component:p("/getting-started/","0e2"),exact:!0,sidebar:"platform"},{path:"/getting-started/tutorials/",component:p("/getting-started/tutorials/","fc2"),exact:!0,sidebar:"platform"},{path:"/getting-started/tutorials/the-basics/",component:p("/getting-started/tutorials/the-basics/","424"),exact:!0,sidebar:"platform"},{path:"/getting-started/tutorials/the-basics/app",component:p("/getting-started/tutorials/the-basics/app","0f5"),exact:!0,sidebar:"platform"},{path:"/getting-started/tutorials/the-basics/object",component:p("/getting-started/tutorials/the-basics/object","78c"),exact:!0,sidebar:"platform"},{path:"/getting-started/tutorials/the-basics/relationship",component:p("/getting-started/tutorials/the-basics/relationship","eb3"),exact:!0,sidebar:"platform"},{path:"/getting-started/tutorials/the-basics/workflow-rules",component:p("/getting-started/tutorials/the-basics/workflow-rules","79c"),exact:!0,sidebar:"platform"},{path:"/getting-started/user/",component:p("/getting-started/user/","5fd"),exact:!0,sidebar:"platform"},{path:"/getting-started/user/download-apps",component:p("/getting-started/user/download-apps","afb"),exact:!0,sidebar:"platform"},{path:"/getting-started/user/overview",component:p("/getting-started/user/overview","a79"),exact:!0,sidebar:"platform"},{path:"/integration",component:p("/integration","f59"),exact:!0,sidebar:"platform"},{path:"/integration/external-datasources",component:p("/integration/external-datasources","e16"),exact:!0,sidebar:"platform"},{path:"/integration/node-red",component:p("/integration/node-red","96b"),exact:!0,sidebar:"platform"},{path:"/no-code",component:p("/no-code","17c"),exact:!0},{path:"/no-code/application/",component:p("/no-code/application/","b86"),exact:!0,sidebar:"platform"},{path:"/no-code/application/app",component:p("/no-code/application/app","ee7"),exact:!0,sidebar:"platform"},{path:"/no-code/application/overview",component:p("/no-code/application/overview","461"),exact:!0,sidebar:"platform"},{path:"/no-code/application/pages",component:p("/no-code/application/pages","d6f"),exact:!0,sidebar:"platform"},{path:"/no-code/application/tab",component:p("/no-code/application/tab","028"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/",component:p("/no-code/customize/","838"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/button",component:p("/no-code/customize/button","041"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/fields/",component:p("/no-code/customize/fields/","943"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/fields/field-attributes",component:p("/no-code/customize/fields/field-attributes","646"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/fields/field-type-autonumber",component:p("/no-code/customize/fields/field-type-autonumber","953"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/fields/field-type-summary",component:p("/no-code/customize/fields/field-type-summary","ca3"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/fields/field-types",component:p("/no-code/customize/fields/field-types","361"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/fields/relationship",component:p("/no-code/customize/fields/relationship","422"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/formula/",component:p("/no-code/customize/formula/","f04"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/formula/cross-object",component:p("/no-code/customize/formula/cross-object","177"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/formula/datetime",component:p("/no-code/customize/formula/datetime","fd3"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/formula/formula-field",component:p("/no-code/customize/formula/formula-field","e3c"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/formula/functions",component:p("/no-code/customize/formula/functions","653"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/formula/overview",component:p("/no-code/customize/formula/overview","52c"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/listview",component:p("/no-code/customize/listview","bab"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/object",component:p("/no-code/customize/object","00b"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/object-relationship",component:p("/no-code/customize/object-relationship","492"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/page-layout",component:p("/no-code/customize/page-layout","323"),exact:!0,sidebar:"platform"},{path:"/no-code/customize/validation-rules",component:p("/no-code/customize/validation-rules","658"),exact:!0,sidebar:"platform"},{path:"/plugins",component:p("/plugins","761"),exact:!0,sidebar:"platform"},{path:"/plugins/integration-ding",component:p("/plugins/integration-ding","33f"),exact:!0,sidebar:"platform"},{path:"/plugins/integration-qywx",component:p("/plugins/integration-qywx","1ce"),exact:!0,sidebar:"platform"}]},{path:"*",component:p("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},7221:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),s=n(412);const l=[n(6657),n(2497),n(3310),n(8320),n(2295),n(8968)];var c=n(723),u=n(6550),d=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),m=n(5742),h=n(2263),g=n(4996),v=n(6668),b=n(1944),y=n(4711),w=n(9727),k=n(3320),E=n(8780),x=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),a=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,u.TH)();return e+(0,E.applyTrailingSlash)((0,g.Z)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,v.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(b.d,{image:n}),r.createElement(_,null),r.createElement(S,null),r.createElement(x.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,f.Z)({key:t},e))))))}const T=new Map;function R(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var A=n(8934),L=n(8940);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),P("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function I(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?P("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),I(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(u.AW,{location:t,render:()=>e}))}}const D=O,M="__docusaurus-base-url-issue-banner-container",z="__docusaurus-base-url-issue-banner",F="__docusaurus-base-url-issue-banner-suggestion-container",j="__DOCUSAURUS_INSERT_BASEURL_BANNER";function B(e){return`\nwindow['${j}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${j}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[j]=!1}),[]),r.createElement(r.Fragment,null,!s.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,B(e))),r.createElement("div",{id:M}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?r.createElement($,null):null}function q(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.Z)(),i=(0,g.Z)(e),{htmlLang:s,direction:l}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:s,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var H=n(4763),G=n(2389);function Z(){const e=(0,G.Z)();return r.createElement(m.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function Q(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return r.createElement(H.Z,null,r.createElement(L.M,null,r.createElement(A.t,null,r.createElement(p,null,r.createElement(q,null),r.createElement(C,null),r.createElement(U,null),r.createElement(D,{location:R(t)},e)),r.createElement(Z,null))))}var W=n(6887);const V=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var K=n(9670);const Y=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,K.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?V(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),I(e))},te=Object.freeze(ee);if(s.Z.canUseDOM){window.docusaurus=te;const e=a.hydrate;I(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(Q,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-XVSWFLK780"],"anonymizeIP":true,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"getting-started/README","docs":[{"id":"admin","path":"/admin"},{"id":"admin/organization/audit-logs","path":"/admin/organization/audit-logs","sidebar":"platform"},{"id":"admin/organization/company-info","path":"/admin/organization/company-info","sidebar":"platform"},{"id":"admin/organization/import","path":"/admin/organization/import","sidebar":"platform"},{"id":"admin/organization/installed-packages","path":"/admin/organization/installed-packages","sidebar":"platform"},{"id":"admin/organization/organizations","path":"/admin/organization/organizations","sidebar":"platform"},{"id":"admin/organization/README","path":"/admin/organization/","sidebar":"platform"},{"id":"admin/organization/users","path":"/admin/organization/users","sidebar":"platform"},{"id":"admin/organization/white-label","path":"/admin/organization/white-label","sidebar":"platform"},{"id":"admin/permissions/app-permissions","path":"/admin/permissions/app-permissions","sidebar":"platform"},{"id":"admin/permissions/before-find","path":"/admin/permissions/before-find","sidebar":"platform"},{"id":"admin/permissions/division","path":"/admin/permissions/division","sidebar":"platform"},{"id":"admin/permissions/field-permissions","path":"/admin/permissions/field-permissions","sidebar":"platform"},{"id":"admin/permissions/index","path":"/admin/permissions/","sidebar":"platform"},{"id":"admin/permissions/object-permissions","path":"/admin/permissions/object-permissions","sidebar":"platform"},{"id":"admin/permissions/overview","path":"/admin/permissions/overview","sidebar":"platform"},{"id":"admin/permissions/permission-set","path":"/admin/permissions/permission-set","sidebar":"platform"},{"id":"admin/permissions/profile","path":"/admin/permissions/profile","sidebar":"platform"},{"id":"admin/permissions/restriction-rules","path":"/admin/permissions/restriction-rules","sidebar":"platform"},{"id":"admin/permissions/sharing-rules","path":"/admin/permissions/sharing-rules","sidebar":"platform"},{"id":"apps/collaboration/approval-king/README","path":"/apps/collaboration/approval-king/","sidebar":"apps"},{"id":"apps/collaboration/milestone/README","path":"/apps/collaboration/milestone/","sidebar":"apps"},{"id":"apps/collaboration/README","path":"/apps/collaboration/","sidebar":"apps"},{"id":"apps/customer-relationship-management/README","path":"/apps/customer-relationship-management/","sidebar":"apps"},{"id":"apps/customer-relationship-management/sales/README","path":"/apps/customer-relationship-management/sales/","sidebar":"apps"},{"id":"apps/customer-relationship-management/service/README","path":"/apps/customer-relationship-management/service/","sidebar":"apps"},{"id":"apps/getting-started/deploy","path":"/apps/getting-started/deploy","sidebar":"apps"},{"id":"apps/getting-started/overview","path":"/apps/getting-started/overview","sidebar":"apps"},{"id":"apps/human-capital-management/attendance/README","path":"/apps/human-capital-management/attendance/","sidebar":"apps"},{"id":"apps/human-capital-management/employee/README","path":"/apps/human-capital-management/employee/","sidebar":"apps"},{"id":"apps/human-capital-management/performance/README","path":"/apps/human-capital-management/performance/","sidebar":"apps"},{"id":"apps/human-capital-management/README","path":"/apps/human-capital-management/","sidebar":"apps"},{"id":"apps/spend-management/contract/README","path":"/apps/spend-management/contract/","sidebar":"apps"},{"id":"apps/spend-management/expense/README","path":"/apps/spend-management/expense/","sidebar":"apps"},{"id":"apps/spend-management/invoice/README","path":"/apps/spend-management/invoice/","sidebar":"apps"},{"id":"apps/spend-management/project/README","path":"/apps/spend-management/project/","sidebar":"apps"},{"id":"apps/spend-management/README","path":"/apps/spend-management/","sidebar":"apps"},{"id":"apps/spend-management/supplier/README","path":"/apps/spend-management/supplier/","sidebar":"apps"},{"id":"apps/spend-management/tender/README","path":"/apps/spend-management/tender/","sidebar":"apps"},{"id":"automation","path":"/automation","sidebar":"platform"},{"id":"automation/approval-king/admin-guide","path":"/automation/approval-king/admin-guide","sidebar":"platform"},{"id":"automation/approval-king/getting-started","path":"/automation/approval-king/getting-started","sidebar":"platform"},{"id":"automation/approval-king/index","path":"/automation/approval-king/","sidebar":"platform"},{"id":"automation/approval-process","path":"/automation/approval-process","sidebar":"platform"},{"id":"automation/automated-actions","path":"/automation/automated-actions","sidebar":"platform"},{"id":"automation/workflow-rules","path":"/automation/workflow-rules","sidebar":"platform"},{"id":"deploy","path":"/deploy","sidebar":"platform"},{"id":"deploy/deploy-docker","path":"/deploy/deploy-docker","sidebar":"platform"},{"id":"deploy/gitpod","path":"/deploy/gitpod","sidebar":"platform"},{"id":"deploy/intranet","path":"/deploy/intranet","sidebar":"platform"},{"id":"deploy/steedos-config","path":"/deploy/steedos-config","sidebar":"platform"},{"id":"developer","path":"/developer","sidebar":"developer"},{"id":"developer/api/api-jwt-sso","path":"/developer/api/api-jwt-sso","sidebar":"developer"},{"id":"developer/api/api-process","path":"/developer/api/api-process","sidebar":"developer"},{"id":"developer/api/api-validate","path":"/developer/api/api-validate","sidebar":"developer"},{"id":"developer/api/graphql-api","path":"/developer/api/graphql-api","sidebar":"developer"},{"id":"developer/api/openapi","path":"/developer/api/openapi","sidebar":"developer"},{"id":"developer/api/overview","path":"/developer/api/overview","sidebar":"developer"},{"id":"developer/api/README","path":"/developer/api/","sidebar":"developer"},{"id":"developer/micro-page/amis/base_config","path":"/developer/micro-page/amis/base_config","sidebar":"developer"},{"id":"developer/micro-page/amis/data","path":"/developer/micro-page/amis/data","sidebar":"developer"},{"id":"developer/micro-page/amis/data_mapping","path":"/developer/micro-page/amis/data_mapping","sidebar":"developer"},{"id":"developer/micro-page/amis/event","path":"/developer/micro-page/amis/event","sidebar":"developer"},{"id":"developer/micro-page/amis/expression","path":"/developer/micro-page/amis/expression","sidebar":"developer"},{"id":"developer/micro-page/amis/linkage","path":"/developer/micro-page/amis/linkage","sidebar":"developer"},{"id":"developer/micro-page/amis/README","path":"/developer/micro-page/amis/","sidebar":"developer"},{"id":"developer/micro-page/amis/styles","path":"/developer/micro-page/amis/styles","sidebar":"developer"},{"id":"developer/micro-page/amis/tpl","path":"/developer/micro-page/amis/tpl","sidebar":"developer"},{"id":"developer/micro-page/components/object_form","path":"/developer/micro-page/components/object_form","sidebar":"developer"},{"id":"developer/micro-page/components/object_listview","path":"/developer/micro-page/components/object_listview","sidebar":"developer"},{"id":"developer/micro-page/components/object_table","path":"/developer/micro-page/components/object_table","sidebar":"developer"},{"id":"developer/micro-page/components/README","path":"/developer/micro-page/components/","sidebar":"developer"},{"id":"developer/micro-page/components/record_detail_header","path":"/developer/micro-page/components/record_detail_header","sidebar":"developer"},{"id":"developer/micro-page/components/record_detail_related_list","path":"/developer/micro-page/components/record_detail_related_list","sidebar":"developer"},{"id":"developer/micro-page/custom_components","path":"/developer/micro-page/custom_components","sidebar":"developer"},{"id":"developer/micro-page/getting_start","path":"/developer/micro-page/getting_start","sidebar":"developer"},{"id":"developer/micro-page/overview","path":"/developer/micro-page/overview","sidebar":"developer"},{"id":"developer/micro-page/README","path":"/developer/micro-page/","sidebar":"developer"},{"id":"developer/package/metadata/metadata-automation","path":"/developer/package/metadata/metadata-automation","sidebar":"developer"},{"id":"developer/package/metadata/metadata-object","path":"/developer/package/metadata/metadata-object","sidebar":"developer"},{"id":"developer/package/metadata/metadata-permissions","path":"/developer/package/metadata/metadata-permissions","sidebar":"developer"},{"id":"developer/package/metadata/metadata-ui","path":"/developer/package/metadata/metadata-ui","sidebar":"developer"},{"id":"developer/package/metadata/README","path":"/developer/package/metadata/","sidebar":"developer"},{"id":"developer/package/overview","path":"/developer/package/overview","sidebar":"developer"},{"id":"developer/package/package-install","path":"/developer/package/package-install","sidebar":"developer"},{"id":"developer/package/package-publish","path":"/developer/package/package-publish","sidebar":"developer"},{"id":"developer/package/README","path":"/developer/package/","sidebar":"developer"},{"id":"developer/package/sync-metadata","path":"/developer/package/sync-metadata","sidebar":"developer"},{"id":"developer/service/action-api","path":"/developer/service/action-api","sidebar":"developer"},{"id":"developer/service/action-trigger","path":"/developer/service/action-trigger","sidebar":"developer"},{"id":"developer/service/locale","path":"/developer/service/locale","sidebar":"developer"},{"id":"developer/service/moleculer/actions","path":"/developer/service/moleculer/actions","sidebar":"developer"},{"id":"developer/service/moleculer/events","path":"/developer/service/moleculer/events","sidebar":"developer"},{"id":"developer/service/moleculer/README","path":"/developer/service/moleculer/","sidebar":"developer"},{"id":"developer/service/moleculer/repl","path":"/developer/service/moleculer/repl","sidebar":"developer"},{"id":"developer/service/objectql","path":"/developer/service/objectql","sidebar":"developer"},{"id":"developer/service/overview","path":"/developer/service/overview","sidebar":"developer"},{"id":"developer/service/package-service","path":"/developer/service/package-service","sidebar":"developer"},{"id":"developer/service/README","path":"/developer/service/","sidebar":"developer"},{"id":"developer/service/service-api/README","path":"/developer/service/service-api/","sidebar":"developer"},{"id":"developer/service/service-api/service-graphql","path":"/developer/service/service-api/service-graphql","sidebar":"developer"},{"id":"developer/service/service-api/service-push","path":"/developer/service/service-api/service-push","sidebar":"developer"},{"id":"developer/service/service-api/service-sms","path":"/developer/service/service-api/service-sms","sidebar":"developer"},{"id":"developer/setup/create-steedos-app","path":"/developer/setup/create-steedos-app","sidebar":"developer"},{"id":"developer/setup/overview","path":"/developer/setup/overview","sidebar":"developer"},{"id":"developer/setup/project-start","path":"/developer/setup/project-start","sidebar":"developer"},{"id":"developer/setup/README","path":"/developer/setup/","sidebar":"developer"},{"id":"developer/setup/sample-repository","path":"/developer/setup/sample-repository","sidebar":"developer"},{"id":"developer/setup/steedos-cli","path":"/developer/setup/steedos-cli","sidebar":"developer"},{"id":"getting-started/README","path":"/getting-started/","sidebar":"platform"},{"id":"getting-started/tutorials/README","path":"/getting-started/tutorials/","sidebar":"platform"},{"id":"getting-started/tutorials/the-basics/app","path":"/getting-started/tutorials/the-basics/app","sidebar":"platform"},{"id":"getting-started/tutorials/the-basics/object","path":"/getting-started/tutorials/the-basics/object","sidebar":"platform"},{"id":"getting-started/tutorials/the-basics/README","path":"/getting-started/tutorials/the-basics/","sidebar":"platform"},{"id":"getting-started/tutorials/the-basics/relationship","path":"/getting-started/tutorials/the-basics/relationship","sidebar":"platform"},{"id":"getting-started/tutorials/the-basics/workflow-rules","path":"/getting-started/tutorials/the-basics/workflow-rules","sidebar":"platform"},{"id":"getting-started/user/download-apps","path":"/getting-started/user/download-apps","sidebar":"platform"},{"id":"getting-started/user/overview","path":"/getting-started/user/overview","sidebar":"platform"},{"id":"getting-started/user/README","path":"/getting-started/user/","sidebar":"platform"},{"id":"integration","path":"/integration","sidebar":"platform"},{"id":"integration/external-datasources","path":"/integration/external-datasources","sidebar":"platform"},{"id":"integration/node-red","path":"/integration/node-red","sidebar":"platform"},{"id":"no-code","path":"/no-code"},{"id":"no-code/application/app","path":"/no-code/application/app","sidebar":"platform"},{"id":"no-code/application/overview","path":"/no-code/application/overview","sidebar":"platform"},{"id":"no-code/application/pages","path":"/no-code/application/pages","sidebar":"platform"},{"id":"no-code/application/README","path":"/no-code/application/","sidebar":"platform"},{"id":"no-code/application/tab","path":"/no-code/application/tab","sidebar":"platform"},{"id":"no-code/customize/button","path":"/no-code/customize/button","sidebar":"platform"},{"id":"no-code/customize/fields/field-attributes","path":"/no-code/customize/fields/field-attributes","sidebar":"platform"},{"id":"no-code/customize/fields/field-type-autonumber","path":"/no-code/customize/fields/field-type-autonumber","sidebar":"platform"},{"id":"no-code/customize/fields/field-type-summary","path":"/no-code/customize/fields/field-type-summary","sidebar":"platform"},{"id":"no-code/customize/fields/field-types","path":"/no-code/customize/fields/field-types","sidebar":"platform"},{"id":"no-code/customize/fields/README","path":"/no-code/customize/fields/","sidebar":"platform"},{"id":"no-code/customize/fields/relationship","path":"/no-code/customize/fields/relationship","sidebar":"platform"},{"id":"no-code/customize/formula/cross-object","path":"/no-code/customize/formula/cross-object","sidebar":"platform"},{"id":"no-code/customize/formula/datetime","path":"/no-code/customize/formula/datetime","sidebar":"platform"},{"id":"no-code/customize/formula/formula-field","path":"/no-code/customize/formula/formula-field","sidebar":"platform"},{"id":"no-code/customize/formula/functions","path":"/no-code/customize/formula/functions","sidebar":"platform"},{"id":"no-code/customize/formula/overview","path":"/no-code/customize/formula/overview","sidebar":"platform"},{"id":"no-code/customize/formula/README","path":"/no-code/customize/formula/","sidebar":"platform"},{"id":"no-code/customize/listview","path":"/no-code/customize/listview","sidebar":"platform"},{"id":"no-code/customize/object","path":"/no-code/customize/object","sidebar":"platform"},{"id":"no-code/customize/object-relationship","path":"/no-code/customize/object-relationship","sidebar":"platform"},{"id":"no-code/customize/page-layout","path":"/no-code/customize/page-layout","sidebar":"platform"},{"id":"no-code/customize/README","path":"/no-code/customize/","sidebar":"platform"},{"id":"no-code/customize/validation-rules","path":"/no-code/customize/validation-rules","sidebar":"platform"},{"id":"plugins","path":"/plugins","sidebar":"platform"},{"id":"plugins/integration-ding","path":"/plugins/integration-ding","sidebar":"platform"},{"id":"plugins/integration-qywx","path":"/plugins/integration-qywx","sidebar":"platform"}],"draftIds":[],"sidebars":{"platform":{"link":{"path":"/getting-started/","label":"getting-started/README"}},"developer":{"link":{"path":"/developer","label":"developer"}},"apps":{"link":{"path":"/apps/getting-started/overview","label":"apps/getting-started/overview"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en","zh-CN"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"},"zh-CN":{"label":"\u4e2d\u6587\uff08\u4e2d\u56fd\uff09","direction":"ltr","htmlLang":"zh-CN","calendar":"gregory","path":"zh-CN"}}}');var s=n(7529);const l=JSON.parse('{"docusaurusVersion":"2.4.3","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"},"docusaurus-plugin-pwa":{"type":"package","name":"@docusaurus/plugin-pwa","version":"2.4.3"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.35.0"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"2.4.3"}}}'),c={siteConfig:a.default,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(412),o=n(5742),i=n(8780),s=n(179);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(c,{error:t}))}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function u(e){let{error:t,tryAgain:n}=e;return r.createElement(p,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(s.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const d=e=>r.createElement(u,e);class p extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),s=n(2263),l=n(3919),c=n(412);const u=a.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:v=!0,...b}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,s.Z)(),{withBaseUrl:k}=(0,d.C)(),E=(0,a.useContext)(u),x=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>x.current));const S=p||f;const _=(0,l.Z)(S),C=S?.replace("pathname://","");let T=void 0!==C?(R=C,v&&(e=>e.startsWith("/"))(R)?k(R):R):void 0;var R;T&&_&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:w}));const A=(0,a.useRef)(!1),L=n?o.OL:o.rU,P=c.Z.canUseIntersectionObserver,N=(0,a.useRef)(),I=()=>{A.current||null==T||(window.docusaurus.preload(T),A.current=!0)};(0,a.useEffect)((()=>(!P&&_&&null!=T&&window.docusaurus.prefetch(T),()=>{P&&N.current&&N.current.disconnect()})),[N,T,P,_]);const O=T?.startsWith("#")??!1,D=!T||!_||O;return D||g||E.collectLink(T),D?a.createElement("a",(0,r.Z)({ref:x,href:T},S&&!_&&{target:"_blank",rel:"noopener noreferrer"},b)):a.createElement(L,(0,r.Z)({},b,{onMouseEnter:I,onTouchStart:I,innerRef:e=>{x.current=e,P&&e&&_&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T},n&&{isActive:h,activeClassName:m}))}const f=a.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>s});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function l(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const s=i({message:t,id:n});return r.createElement(r.Fragment,null,a(s,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>h,gA:()=>p,_r:()=>u,Jo:()=>g,zh:()=>d,yW:()=>m,gB:()=>f});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const c={},u=()=>i("docusaurus-plugin-content-docs")??c,d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function f(e){return d(e).versions}function m(e){const t=d(e);return s(t)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return l(t,n)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},8968:(e,t,n)=>{"use strict";n.r(t);var r=n(412),a=n(12);const o="/sw.js",i=["appInstalled","standalone","queryString"],s=!0,l=(0,a.WA)("docusaurus.pwa.event.appInstalled.fired");function c(e,t){s&&(void 0===t?console.log(`[Docusaurus-PWA][registerSw]: ${e}`):console.log(`[Docusaurus-PWA][registerSw]: ${e}`,t))}async function u(){const e=await navigator.serviceWorker.getRegistrations();c("will unregister all service workers",{registrations:e}),await Promise.all(e.map((e=>e.unregister().then((t=>c("unregister service worker",{registration:e,result:t})))))),c("unregistered all service workers",{registrations:e}),window.location.reload()}const d={always:()=>!0,mobile:()=>window.innerWidth<=996,saveData:()=>!!navigator.connection?.saveData,appInstalled:()=>"true"===l.get()||async function(){return"getInstalledRelatedApps"in window.navigator&&(await navigator.getInstalledRelatedApps()).some((e=>"webapp"===e.platform))}(),standalone:()=>window.matchMedia("(display-mode: standalone)").matches,queryString:()=>"true"===new URLSearchParams(window.location.search).get("offlineMode")};async function p(){const e=await async function(){return(await Promise.all(i.map((e=>Promise.resolve(d[e]()).then((t=>t?e:void 0)))))).filter(Boolean)}(),t=e.length>0;return c(t?"offline mode enabled, because of activation strategies":"offline mode disabled, because none of the offlineModeActivationStrategies could be used",{activeStrategies:e,availableStrategies:i}),t}r.Z.canUseDOM&&(c("debug mode enabled"),"serviceWorker"in navigator&&(c("addLegacyAppInstalledEventsListeners"),window.addEventListener("appinstalled",(e=>{c("event appinstalled",{event:e}),l.set("true"),c("AppInstalledEventFiredStorage.set('true')"),u()})),window.addEventListener("beforeinstallprompt",(e=>{c("event beforeinstallprompt",{event:e});const t=l.get();c("AppInstalledEventFiredStorage.get()",{appInstalledEventFired:t}),t&&(l.del(),c("AppInstalledEventFiredStorage.del()"),u())})),c("legacy appinstalled and beforeinstallprompt event listeners installed"),async function(){const[{Workbox:e},t]=await Promise.all([n.e(5131).then(n.bind(n,5131)),p()]),r=new e(function(e){const t=JSON.stringify(e),n=`${o}?params=${encodeURIComponent(t)}`;return c("service worker url",{url:n,params:e}),n}({offlineMode:t,debug:s})),a=()=>r.messageSW({type:"SKIP_WAITING"}),i=()=>(c("handleServiceWorkerWaiting"),t?n.e(5283).then(n.bind(n,5283)).then((e=>{let{renderReloadPopup:t}=e;return t({onReload(){r.addEventListener("controlling",(()=>{window.location.reload()})),a()}})})):a());r.addEventListener("waiting",(e=>{c("event waiting",{event:e}),i()})),r.addEventListener("externalwaiting",(e=>{c("event externalwaiting",{event:e}),i()}));const l=await r.register();l&&(l.active&&c("registration.active",{registration:l}),l.installing&&c("registration.installing",{registration:l}),l.waiting&&(c("registration.waiting",{registration:l}),await i()))}().catch((e=>console.error("registerSW failed",e)))))},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},179:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Nt});var r=n(7294),a=n(6010),o=n(4763),i=n(1944),s=n(7462),l=n(6550),c=n(5999),u=n(5936);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,c.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:a}=f();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,s.Z)({},e,{href:`#${d}`,onClick:a}),t))}var g=n(5281),v=n(9727);const b={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:b.skipToContent})}var w=n(6668),k=n(9689);function E(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,s.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const x={closeButton:"closeButton_CVFx"};function S(e){return r.createElement("button",(0,s.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",x.closeButton,e.className)}),r.createElement(E,{width:14,height:14,strokeWidth:3.1}))}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,s.Z)({},e,{className:(0,a.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function R(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:T.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:T.announcementBarPlaceholder}),r.createElement(C,{className:T.announcementBarContent}),i&&r.createElement(S,{onClick:n,className:T.announcementBarClose}))}var A=n(3163),L=n(2466);var P=n(902),N=n(3102);const I=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,A.e)(),t=(0,N.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,P.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(I.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(I);if(!e)throw new P.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,N.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:D(o)})),[a,o,t])}function z(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=M();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var F=n(2949),j=n(2389);function B(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function $(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const s=(0,j.Z)(),l=(0,c.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(U.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!s&&U.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!s,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(B,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),r.createElement($,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})))}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,F.I)();return a?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var Q=n(1327);function W(){return r.createElement(Q.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function V(){const e=(0,A.e)();return r.createElement("button",{type:"button","aria-label":(0,c.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(E,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(Z,{className:"margin-right--md"}),r.createElement(V,null))}var Y=n(9960),X=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:l,isDropdownLink:c,prependBaseUrlToHref:u,...d}=e;const p=(0,X.Z)(a),f=(0,X.Z)(t),m=(0,X.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,J.Z)(o),g=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(te.Z,c&&{width:12,height:12}))};return o?r.createElement(Y.Z,(0,s.Z)({href:u?m:o},d,g)):r.createElement(Y.Z,(0,s.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},d,g))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,s.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,s.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,s.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),se=n(8596),le=n(2263);function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const c=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{c.current&&!c.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[c]),r.createElement("div",{ref:c,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},r.createElement(ne,(0,s.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(Ge,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...c}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(ne,(0,s.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},c,{onClick:e=>{e.preventDefault(),f()}}),c.children??c.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>r.createElement(Ge,(0,s.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function pe(e){let{mobile:t=!1,...n}=e;const a=t?de:ue;return r.createElement(a,n)}var fe=n(4711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const he="iconLanguage_nlXk";var ge=n(1029),ve=n(412),be=n(373),ye=n(143),we=n(22),ke=n(8202),Ee=n(3926),xe=n(1073),Se=n(2539),_e=n(726);const Ce='',Te='',Re='',Ae='',Le='',Pe='',Ne='',Ie={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Oe(e){let{document:t,type:n,page:r,metadata:a,tokens:o,isInterOfTree:i,isLastOfTree:s}=e;const l=0===n,c=1===n,u=[];i?u.push(Pe):s&&u.push(Ne);const d=u.map((e=>`${e}`)),p=`${l?Ce:c?Te:Re}`,f=[`${(0,_e.o)(t.t,(0,xe.m)(a,"t"),o)}`];if(!i&&!s&&ge.H6){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;f.push(`${(0,Ee.e)(e??[])}`)}else l||f.push(`${(0,Se.C)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),o)}`);const m=`${Ae}`;return[...d,p,``,...f,"",m].join("")}function De(){return`${Le}${(0,c.I)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var Me=n(311);async function ze(){const e=await Promise.all([n.e(8443),n.e(5525)]).then(n.t.bind(n,8443,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const Fe="_highlight";const je=function(e){let{handleSearchBarToggle:t}=e;const{siteConfig:{baseUrl:n}}=(0,le.Z)(),o=(0,ye.gA)();let i=n;try{const{preferredVersion:e}=(0,be.J)(o?.pluginId??ge.gQ);e&&!e.isLast&&(i=e.path+"/")}catch(D){if(ge.l9&&!(D instanceof P.i6))throw D}const s=(0,l.k6)(),u=(0,l.TH)(),d=(0,r.useRef)(null),p=(0,r.useRef)(new Map),f=(0,r.useRef)(!1),[m,h]=(0,r.useState)(!1),[g,v]=(0,r.useState)(!1),[b,y]=(0,r.useState)(""),w=(0,r.useRef)(null),k=(0,r.useRef)(""),[E,x]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(ge.Kc))return;let e="";if(u.pathname.startsWith(i)){const t=u.pathname.substring(i.length),n=ge.Kc.find((e=>t===e||t.startsWith(`${e}/`)));n&&(e=n)}k.current!==e&&(p.current.delete(e),k.current=e),x(e)}),[u.pathname,i]);const S=!!ge.hG&&Array.isArray(ge.Kc)&&""===E,_=(0,r.useCallback)((async()=>{if(S||p.current.get(E))return;p.current.set(E,"loading"),w.current?.autocomplete.destroy(),h(!0);const[{wrappedIndexes:e,zhDictionary:t},r]=await Promise.all([(0,we.w)(i,E),ze()]);if(w.current=r(d.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,a.Z)(Ie.searchBar,{[Ie.searchBarLeft]:"left"===ge.pu}),noPrefix:!0,dropdownMenu:Ie.dropdownMenu,input:Ie.input,hint:Ie.hint,suggestions:Ie.suggestions,suggestion:Ie.suggestion,cursor:Ie.cursor,dataset:Ie.dataset,empty:Ie.empty}},[{source:(0,ke.v)(e,t,ge.qo),templates:{suggestion:Oe,empty:De,footer:e=>{let{query:t,isEmpty:r}=e;if(r&&!E)return;const a=(e=>{let{query:t,isEmpty:r}=e;const a=document.createElement("a"),o=new URLSearchParams,l=(0,c.I)({id:"theme.SearchBar.seeAll",message:"See all results"}),u=(0,c.I)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:E}),d=(0,c.I)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:E});let p;if(o.set("q",t),p=E&&r?u:E?d:l,Array.isArray(ge.Kc)&&!r&&o.set("ctx",E),i!==n){if(!i.startsWith(n))throw new Error(`Version url '${i}' does not start with base url '${n}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);o.set("version",i.substring(n.length))}const f=`${n}search?${o.toString()}`;return a.href=f,a.textContent=p,a.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),w.current?.autocomplete.close(),s.push(f))})),a})({query:t,isEmpty:r}),o=document.createElement("div");return o.className=Ie.hitFooter,o.appendChild(a),o}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:a}=t;d.current?.blur();let o=n;if(ge.vc&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append(Fe,t);o+=`?${e.toString()}`}r&&(o+=r),s.push(o)})).on("autocomplete:closed",(()=>{d.current?.blur()})),p.current.set(E,"done"),h(!1),f.current){const e=d.current;e.value&&w.current?.autocomplete.open(),e.focus()}}),[S,E,i,n,s]);(0,r.useEffect)((()=>{if(!ge.vc)return;const e=ve.Z.canUseDOM?new URLSearchParams(u.search).getAll(Fe):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new ge.vc(t);n.unmark(),0!==e.length&&n.mark(e),y(e.join(" ")),w.current?.autocomplete.setVal(e.join(" "))}))}),[u.search,u.pathname]);const[C,T]=(0,r.useState)(!1),R=(0,r.useCallback)((()=>{f.current=!0,_(),T(!0),t?.(!0)}),[t,_]),A=(0,r.useCallback)((()=>{T(!1),t?.(!1)}),[t]),L=(0,r.useCallback)((()=>{_()}),[_]),N=(0,r.useCallback)((e=>{y(e.target.value),e.target.value&&v(!0)}),[]),I=!!ve.Z.canUseDOM&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!ge.AY)return;const e=e=>{!(I?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),d.current?.focus(),R())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[I,R]);const O=(0,r.useCallback)((()=>{const e=new URLSearchParams(u.search);e.delete(Fe);const t=e.toString(),n=u.pathname+(""!=t?`?${t}`:"")+u.hash;n!=u.pathname+u.search+u.hash&&s.push(n),y(""),w.current?.autocomplete.setVal("")}),[u.pathname,u.search,u.hash,s]);return r.createElement("div",{className:(0,a.Z)("navbar__search",Ie.searchBarContainer,{[Ie.searchIndexLoading]:m&&g,[Ie.focused]:C}),hidden:S},r.createElement("input",{placeholder:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:L,onFocus:R,onBlur:A,onChange:N,ref:d,value:b}),r.createElement(Me.Z,{className:Ie.searchBarLoadingRing}),ge.AY&&ge.t_&&(""!==b?r.createElement("button",{className:Ie.searchClearButton,onClick:O},"\u2715"):ve.Z.canUseDOM&&r.createElement("div",{className:Ie.searchHintContainer},r.createElement("kbd",{className:Ie.searchHint},I?"\u2318":"ctrl"),r.createElement("kbd",{className:Ie.searchHint},"K"))))},Be={searchBox:"searchBox_ZlJk"};function $e(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,Be.searchBox)},t)}var Ue=n(3438);const qe=e=>e.docs.find((t=>t.id===e.mainDocId));const He={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,le.Z)(),p=(0,fe.l)(),{search:f,hash:m}=(0,l.TH)(),h=[...n,...u.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],g=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(pe,(0,s.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:he}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement($e,{className:n},r.createElement(je,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const s=i?"li":"div";return r.createElement(s,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ye.Iw)(a),l=(0,Ue.vY)(t,a);return null===l?null:r.createElement(oe,(0,s.Z)({exact:!0},o,{isActive:()=>i?.path===l.path||!!i?.sidebar&&i.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ye.Iw)(a),l=(0,Ue.oz)(t,a).link;if(!l)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,s.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,Ue.lO)(a)[0],l=t??i.label,c=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,s.Z)({},o,{label:l,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...u}=e;const{search:d,hash:p}=(0,l.TH)(),f=(0,ye.Iw)(n),m=(0,ye.gB)(n),{savePreferredVersionName:h}=(0,be.J)(n),g=[...o,...m.map((e=>{const t=f.alternateDocVersions[e.name]??qe(e);return{label:e.label,to:`${t.path}${d}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>h(e.name)}})),...i],v=(0,Ue.lO)(n)[0],b=t&&g.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):v.label,y=t&&g.length>1?void 0:qe(v).path;return g.length<=1?r.createElement(oe,(0,s.Z)({},u,{mobile:t,label:b,to:y,isActive:a?()=>!1:void 0})):r.createElement(pe,(0,s.Z)({},u,{mobile:t,label:b,to:y,items:g,isActive:a?()=>!1:void 0}))}};function Ge(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=He[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function Ze(){const e=(0,A.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ge,(0,s.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Qe(e){return r.createElement("button",(0,s.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(c.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function We(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement(Qe,{onClick:()=>t.hide()}),t.content)}function Ve(){const e=(0,A.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(z,{header:r.createElement(K,null),primaryMenu:r.createElement(Ze,null),secondaryMenu:r.createElement(We,null)}):null}const Ke={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ye(e){return r.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Xe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,A.e)(),{navbarRef:s,isNavbarVisible:l}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,L.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:s,"aria-label":(0,c.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ke.navbarHideable,!l&&Ke.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ye,{onClick:i.toggle}),r.createElement(Ve,null))}var Je=n(8780);const et={errorBoundaryError:"errorBoundaryError_a6uf"};function tt(e){return r.createElement("button",(0,s.Z)({type:"button"},e),r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function nt(e){let{error:t}=e;const n=(0,Je.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:et.errorBoundaryError},n)}class rt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const at="right";function ot(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,s.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function it(){const{toggle:e,shown:t}=(0,A.e)();return r.createElement("button",{onClick:e,"aria-label":(0,c.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(ot,null))}const st={colorModeToggle:"colorModeToggle_DEke"};function lt(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(rt,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(Ge,e)))))}function ct(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function ut(){const e=(0,A.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??at)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(ct,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(it,null),r.createElement(W,null),r.createElement(lt,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(lt,{items:a}),r.createElement(Z,{className:st.colorModeToggle}),!o&&r.createElement($e,null,r.createElement(je,null)))})}function dt(){return r.createElement(Xe,null,r.createElement(ut,null))}function pt(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...l}=t,c=(0,X.Z)(n),u=(0,X.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(Y.Z,(0,s.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:c},l),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function ft(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(pt,{item:t}))}function mt(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(ft,{key:t,item:e})))))}function ht(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(mt,{key:t,column:e}))))}function gt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function vt(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(pt,{item:t})}function bt(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(vt,{item:e}),t.length!==n+1&&r.createElement(gt,null))))))}function yt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(ht,{columns:t}):r.createElement(bt,{links:t})}var wt=n(941);const kt={footerLogoLink:"footerLogoLink_BH7S"};function Et(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(wt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function xt(e){let{logo:t}=e;return t.href?r.createElement(Y.Z,{href:t.href,className:kt.footerLogoLink,target:t.target},r.createElement(Et,{logo:t})):r.createElement(Et,{logo:t})}function St(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function _t(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function Ct(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(_t,{style:o,links:n&&n.length>0&&r.createElement(yt,{links:n}),logo:a&&r.createElement(xt,{logo:a}),copyright:t&&r.createElement(St,{copyright:t})})}const Tt=r.memo(Ct),Rt=(0,P.Qc)([F.S,k.pl,L.OC,be.L5,i.VC,function(e){let{children:t}=e;return r.createElement(N.n2,null,r.createElement(A.M,null,r.createElement(O,null,t)))}]);function At(e){let{children:t}=e;return r.createElement(Rt,null,t)}function Lt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(tt,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(nt,{error:t})))))}const Pt={mainWrapper:"mainWrapper_z2l0"};function Nt(e){const{children:t,noFooter:n,wrapperClassName:s,title:l,description:c}=e;return(0,v.t)(),r.createElement(At,null,r.createElement(i.d,{title:l,description:c}),r.createElement(y,null),r.createElement(R,null),r.createElement(dt,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,Pt.mainWrapper,s)},r.createElement(o.Z,{fallback:e=>r.createElement(Lt,e)},t)),!n&&r.createElement(Tt,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),s=n(2263),l=n(6668),c=n(941);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},s=a.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},s):s}function d(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:c}}=(0,l.L)(),{imageClassName:d,titleClassName:p,...f}=e,m=(0,i.Z)(c?.href||"/"),h=n?"":t,g=c?.alt??h;return a.createElement(o.Z,(0,r.Z)({to:m},f,c?.target&&{target:c.target}),c&&a.createElement(u,{logo:c,alt:g,imageClassName:d}),null!=n&&a.createElement("b",{className:p},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),s=n(2949);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,s.I)(),{sources:c,className:u,alt:d,...p}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,f.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(l.themedImage,l[`themedImage--${e}`],u)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>g});var r=n(7462),a=n(7294),o=n(412),i=n(1442);const s="ease-in-out";function l(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?c:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??s}`,height:`${t}px`}}function l(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!o.Z.canUseDOM)return e?c:u}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:l}=e;const c=(0,a.useRef)(null);return p({collapsibleRef:c,collapsed:n,animation:o}),a.createElement(t,{ref:c,style:l?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(c.current,n),i?.(n))},className:s},r)}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[s,l]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&l(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:s})):null}function g(e){let{lazy:t,...n}=e;const r=t?h:m;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>f});var r=n(7294),a=n(2389),o=n(12),i=n(902),s=n(6668);const l=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),u=()=>"true"===l.get(),d=e=>l.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&u()));(0,r.useEffect)((()=>{o(u())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&d(!1),!r&&u()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(p.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(7294),a=n(412),o=n(902),i=n(12),s=n(6668);const l=r.createContext(void 0),c="theme",u=(0,i.WA)(c),d={light:"light",dark:"dark"},p=e=>e===d.dark?d.dark:d.light,f=e=>a.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),m=e=>{u.set(p(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[a,o]=(0,r.useState)(f(e));(0,r.useEffect)((()=>{t&&u.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),u.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(l.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(l);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>b,L5:()=>g});var r=n(7294),a=n(143),o=n(9935),i=n(6668),s=n(3438),l=n(902),c=n(12);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,c.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return r.createElement(f.Provider,{value:n},t)}function g(e){let{children:t}=e;return s.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=v(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>s});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function s(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function l(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>s,q:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t,version:n}=e;return r.createElement(o.Provider,{value:n},t)}function s(){const e=(0,r.useContext)(o);if(null===e)throw new a.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(1980),s=n(6668),l=n(902);const c=r.createContext(void 0);function u(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function d(e){let{children:t}=e;const n=u();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>l,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function s(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,s]=i,l=(0,a.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const l=!1;function c(){const[e,t]=(0,r.useState)((()=>l?"ssr":s()));return(0,r.useEffect)((()=>{function e(){t(s())}const n=l?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},3438:(e,t,n)=>{"use strict";n.d(t,{MN:()=>_,Wl:()=>m,_F:()=>b,cE:()=>p,hI:()=>S,jA:()=>h,lO:()=>k,oz:()=>E,s1:()=>w,vY:()=>x,xz:()=>f});var r=n(7294),a=n(6550),o=n(8790),i=n(143),s=n(373),l=n(4477),c=n(1116),u=n(7392),d=n(8596);const p=!!i._r;function f(e){const t=(0,l.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function m(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=m(t);if(e)return e}}}function h(){const{pathname:e}=(0,a.TH)(),t=(0,c.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=y({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const g=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),v=(e,t)=>e.some((e=>b(e,t)));function b(e,t){return"link"===e.type?g(e.href,t):"category"===e.type&&(g(e.href,t)||v(e.items,t))}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,c.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function k(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,u.j)([t,n,a].filter(Boolean))),[t,n,a])}function E(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function x(e,t){const n=k(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,u.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function S(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,s=i.find((e=>(0,a.LX)(r.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?n.docsSidebars[l]:void 0;return{docElement:(0,o.H)(i),sidebarName:l,sidebarItems:c}}function _(e){return e.filter((e=>"category"!==e.type||!!m(e)))}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>s,_X:()=>l});var r=n(7294),a=n(6550),o=n(1688),i=n(902);function s(e){!function(e){const t=(0,a.k6)(),n=(0,i.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(e){return function(e){const t=(0,a.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>u,VC:()=>f});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),c=n(2263);function u(e){let{title:t,description:n,keywords:a,image:i,children:s}=e;const u=function(e){const{siteConfig:t}=(0,c.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.C)(),p=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),p&&r.createElement("meta",{property:"og:image",content:p}),p&&r.createElement("meta",{name:"twitter:image",content:p}),s)}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:s},r.createElement(o.Z,null,r.createElement("html",{className:s})),n)}function f(e){let{children:t}=e;const n=s(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(p,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>l,i6:()=>s,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function l(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>l,RF:()=>d,o5:()=>p});var r=n(7294),a=n(412),o=n(2389),i=n(902);const s=r.createContext(void 0);function l(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(s.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(u()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function p(){const e=c(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:a}}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(2263);const r="default";function a(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>u});var r=n(7294),a=n(1688);const o="localStorage";function i(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function s(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=s(t?.persistence);return null===n?c:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),i({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),i({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,a.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),a=n(6550),o=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,a.TH)(),c=(0,o.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},311:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294),a=n(6010);const o={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};function i(e){let{className:t}=e;return r.createElement("div",{className:(0,a.Z)(o.loadingRing,t)},r.createElement("div",null),r.createElement("div",null),r.createElement("div",null),r.createElement("div",null))}},22:(e,t,n)=>{"use strict";n.d(t,{w:()=>s});var r=n(1336),a=n.n(r),o=n(1029);const i=new Map;function s(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${o.J.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:a().Index.load(r)}})),s=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(s)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},8202:(e,t,n)=>{"use strict";n.d(t,{v:()=>l});var r=n(1336),a=n.n(r);var o=n(1029);function i(e){return s(e).concat(s(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function s(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:a().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?a().Query.wildcard.TRAILING:a().Query.wildcard.NONE})))})))}function l(e,t,n){return function(r,s){const l=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return a()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,o.dK);if(0===l.length)return void s([]);const c=function(e,t){const n=function(e,t){const n=[];return function e(r,a){if(0===r.length)return void n.push(a);const o=r[0];if(/\p{Unified_Ideograph}/u.test(o)){const n=function(e,t){const n=[];return function e(r,a){let o=0,i=!1;for(const s of t)if(r.substr(0,s.length)===s){const t={missed:a.missed,term:a.term.concat({value:s})};r.length>s.length?e(r.substr(s.length),t):n.push(t),i=!0}else for(let t=s.length-1;t>o;t-=1){const l=s.substr(0,t);if(r.substr(0,t)===l){o=t;const s={missed:a.missed,term:a.term.concat({value:l,trailing:!0})};r.length>t?e(r.substr(t),s):n.push(s),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:a.missed+1,term:a.term}):a.term.length>0&&n.push(a))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(o,t);for(const t of n){const n=a.concat(...t);e(r.slice(1),n)}}else{const t=a.concat({value:o});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:a().Query.presence.REQUIRED,wildcard:a().Query.wildcard.LEADING|a().Query.wildcard.TRAILING})))}];for(const a of n)a[a.length-1].maybeTyping=!0;const r=[];for(const i of o.dK)if("en"===i)o._k||r.unshift(a().stopWordFilter);else{const e=a()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let s;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);s=[];const t=[];for(const r of n){const n=e(r);s.push(n),n.length0&&t.push(n)}n.push(...t)}else s=n.slice();const l=[];for(const a of s)if(a.length>2)for(let e=a.length-1;e>=0;e-=1)l.push(a.slice(0,e).concat(a.slice(e+1)));return i(n).concat(i(l))}(l,t),u=[];e:for(const{term:t,tokens:a}of c)for(const{documents:r,index:o,type:i}of e)if(u.push(...o.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!u.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-u.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:a,score:t.score}}))),u.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,a=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===a&&(a=n.index),r===a?0===t.type?-1:0===n.type?1:t.index-n.index:r-a}))}(u),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{e:()=>r})},1690:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{X:()=>r})},1073:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{m:()=>r})},2539:(e,t,n)=>{"use strict";n.d(t,{C:()=>a});var r=n(1690);function a(e,t,n){const o=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&o.push(a(e.substr(0,n),t)),o.push(`${(0,r.X)(e.substr(n,i.length))}`);const s=n+i.length;s${(0,r.X)(e)}`:(0,r.X)(e):o.join("")}},726:(e,t,n)=>{"use strict";n.d(t,{o:()=>l});var r=n(1690),a=n(2539);const o=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const a=r.match(o);if(!a){t.push(r);break}a.index>0&&t.push(r.substring(0,a.index)),t.push(a[0]),n+=a.index+a[0].length,r=e.substring(n)}return t}var s=n(1029);function l(e,t,n,o){void 0===o&&(o=s.Hk);const{chunkIndex:l,chunks:c}=function(e,t,n){const o=[];let s=0,l=0,c=-1;for(;sl){const t=i(e.substring(l,u)).map((e=>({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}-1===c&&(c=o.length),l=u+d,o.push({html:(0,a.C)(e.substring(u,l),n,!0),textLength:d})}}if(l({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}return{chunkIndex:c,chunks:o}}(e,t,n),u=c.slice(0,l),d=c[l],p=[d.html],f=c.slice(l+1);let m=d.textLength,h=0,g=0,v=!1,b=!1;for(;m0){const e=u.pop();m+e.textLength<=o?(p.unshift(e.html),h+=e.textLength,m+=e.textLength):(v=!0,u.length=0)}else{if(!(f.length>0))break;{const e=f.shift();m+e.textLength<=o?(p.push(e.html),g+=e.textLength,m+=e.textLength):(b=!0,f.length=0)}}return(v||u.length>0)&&p.unshift("\u2026"),(b||f.length>0)&&p.push("\u2026"),p.join("")}},1029:(e,t,n)=>{"use strict";n.d(t,{vc:()=>i(),gQ:()=>g,H6:()=>p,hG:()=>y,l9:()=>v,dK:()=>s,_k:()=>l,pu:()=>h,AY:()=>f,t_:()=>m,Kc:()=>b,J:()=>c,Hk:()=>d,qo:()=>u,pQ:()=>w});var r=n(1336),a=n.n(r),o=n(813),i=n.n(o);n(892)(a()),n(1728).w(a()),n(4182)(a());const s=["en","zh"],l=!1,c="search-index{dir}.json?_=657cfa2b",u=8,d=50,p=!0,f=!0,m=!0,h="right",g=void 0,v=!0,b=null,y=!1,w=!1},1728:(e,t,n)=>{"use strict";function r(e){const t=new RegExp("^[^"+e+"]+","u"),n=new RegExp("[^"+e+"]+$","u");return function(e){return e.update((function(e){return e.replace(t,"").replace(n,"")}))}}function a(e,t){e.trimmerSupport.generateTrimmer=r,e.zh=function(){this.pipeline.reset(),this.pipeline.add(e.zh.trimmer,e.zh.stopWordFilter),t&&(this.tokenizer=t)},t&&(e.zh.tokenizer=t),e.zh.wordCharacters="\\u3400-\\u4DBF\\u4E00-\\u9FFC\\uFA0E\\uFA0F\\uFA11\\uFA13\\uFA14\\uFA1F\\uFA21\\uFA23\\uFA24\\uFA27-\\uFA29\\u{20000}-\\u{2A6DD}\\u{2A700}-\\u{2B734}\\u{2B740}-\\u{2B81D}\\u{2B820}-\\u{2CEA1}\\u{2CEB0}-\\u{2EBE0}\\u{30000}-\\u{3134A}",e.zh.trimmer=e.trimmerSupport.generateTrimmer(e.zh.wordCharacters),e.Pipeline.registerFunction(e.zh.trimmer,"trimmer-zh"),e.zh.stopWordFilter=e.generateStopWordFilter("\u7684 \u4e00 \u4e0d \u5728 \u4eba \u6709 \u662f \u4e3a \u4ee5 \u4e8e \u4e0a \u4ed6 \u800c \u540e \u4e4b \u6765 \u53ca \u4e86 \u56e0 \u4e0b \u53ef \u5230 \u7531 \u8fd9 \u4e0e \u4e5f \u6b64 \u4f46 \u5e76 \u4e2a \u5176 \u5df2 \u65e0 \u5c0f \u6211 \u4eec \u8d77 \u6700 \u518d \u4eca \u53bb \u597d \u53ea \u53c8 \u6216 \u5f88 \u4ea6 \u67d0 \u628a \u90a3 \u4f60 \u4e43 \u5b83 \u5427 \u88ab \u6bd4 \u522b \u8d81 \u5f53 \u4ece \u5230 \u5f97 \u6253 \u51e1 \u513f \u5c14 \u8be5 \u5404 \u7ed9 \u8ddf \u548c \u4f55 \u8fd8 \u5373 \u51e0 \u65e2 \u770b \u636e \u8ddd \u9760 \u5566 \u4e86 \u53e6 \u4e48 \u6bcf \u4eec \u561b \u62ff \u54ea \u90a3 \u60a8 \u51ed \u4e14 \u5374 \u8ba9 \u4ecd \u5565 \u5982 \u82e5 \u4f7f \u8c01 \u867d \u968f \u540c \u6240 \u5979 \u54c7 \u55e1 \u5f80 \u54ea \u4e9b \u5411 \u6cbf \u54df \u7528 \u4e8e \u54b1 \u5219 \u600e \u66fe \u81f3 \u81f4 \u7740 \u8bf8 \u81ea".split(" ")),e.Pipeline.registerFunction(e.zh.stopWordFilter,"stopWordFilter-zh")}n.d(t,{w:()=>a})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>R,Ep:()=>p});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,h(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=f(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},4182:function(e,t,n){var r,a;r=function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),n=t.join("-"),r="",a=[],o=[],i=0;i=n&&t[(a-=n)>>3]&1<<(7&a))return this.cursor++,!0}return!1},in_grouping_b:function(t,n,r){if(this.cursor>this.limit_backward){var a=e.charCodeAt(this.cursor-1);if(a<=r&&a>=n&&t[(a-=n)>>3]&1<<(7&a))return this.cursor--,!0}return!1},out_grouping:function(t,n,r){if(this.cursorr||a>3]&1<<(7&a)))return this.cursor++,!0}return!1},out_grouping_b:function(t,n,r){if(this.cursor>this.limit_backward){var a=e.charCodeAt(this.cursor-1);if(a>r||a>3]&1<<(7&a)))return this.cursor--,!0}return!1},eq_s:function(t,n){if(this.limit-this.cursor>1),d=0,p=s0||a==r||c)break;c=!0}}for(;;){if(s>=(f=t[r]).s_size){if(this.cursor=o+f.s_size,!f.method)return f.result;var h=f.method();if(this.cursor=o+f.s_size,h)return f.result}if((r=f.substring_i)<0)return 0}},find_among_b:function(t,n){for(var r=0,a=n,o=this.cursor,i=this.limit_backward,s=0,l=0,c=!1;;){for(var u=r+(a-r>>1),d=0,p=s=0;f--){if(o-p==i){d=-1;break}if(d=e.charCodeAt(o-1-p)-m.s[f])break;p++}if(d<0?(a=u,l=p):(r=u,s=p),a-r<=1){if(r>0||a==r||c)break;c=!0}}for(;;){var m;if(s>=(m=t[r]).s_size){if(this.cursor=o-m.s_size,!m.method)return m.result;var h=m.method();if(this.cursor=o-m.s_size,h)return m.result}if((r=m.substring_i)<0)return 0}},replace_s:function(t,n,r){var a=r.length-(n-t),o=e.substring(0,t),i=e.substring(n);return e=o+r+i,this.limit+=a,this.cursor>=n?this.cursor+=a:this.cursor>t&&(this.cursor=t),a},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>e.length)throw"faulty slice operation"},slice_from:function(e){this.slice_check(),this.replace_s(this.bra,this.ket,e)},slice_del:function(){this.slice_from("")},insert:function(e,t,n){var r=this.replace_s(e,t,n);e<=this.bra&&(this.bra+=r),e<=this.ket&&(this.ket+=r)},slice_to:function(){return this.slice_check(),e.substring(this.bra,this.ket)},eq_v_b:function(e){return this.eq_s_b(e.length,e)}}}},e.trimmerSupport={generateTrimmer:function(e){var t=new RegExp("^[^"+e+"]+"),n=new RegExp("[^"+e+"]+$");return function(e){return"function"==typeof e.update?e.update((function(e){return e.replace(t,"").replace(n,"")})):e.replace(t,"").replace(n,"")}}}}})?r.call(t,n,t,e):r)||(e.exports=a)},1336:(e,t,n)=>{var r,a;!function(){var o,i,s,l,c,u,d,p,f,m,h,g,v,b,y,w,k,E,x,S,_,C,T,R,A,L,P,N,I,O,D=function(e){var t=new D.Builder;return t.pipeline.add(D.trimmer,D.stopWordFilter,D.stemmer),t.searchPipeline.add(D.stemmer),e.call(t,t),t.build()};D.version="2.3.9",D.utils={},D.utils.warn=(o=this,function(e){o.console&&console.warn&&console.warn(e)}),D.utils.asString=function(e){return null==e?"":e.toString()},D.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=D.utils.clone(t)||{};l.position=[i,s],l.index=a.length,a.push(new D.Token(n.slice(i,o),l))}i=o+1}}return a},D.tokenizer.separator=/[\s\-]+/,D.Pipeline=function(){this._stack=[]},D.Pipeline.registeredFunctions=Object.create(null),D.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&D.utils.warn("Overwriting existing registered function: "+t),e.label=t,D.Pipeline.registeredFunctions[e.label]=e},D.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||D.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},D.Pipeline.load=function(e){var t=new D.Pipeline;return e.forEach((function(e){var n=D.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},D.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){D.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},D.Pipeline.prototype.after=function(e,t){D.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},D.Pipeline.prototype.before=function(e,t){D.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},D.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},D.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=a),o!=e);)r=n-t,a=t+Math.floor(r/2),o=this.elements[2*a];return o==e||o>e?2*a:os?c+=2:i==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},D.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},D.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var o,i=a.str.charAt(0);i in a.node.edges?o=a.node.edges[i]:(o=new D.TokenSet,a.node.edges[i]=o),1==a.str.length&&(o.final=!0),r.push({node:o,editsRemaining:a.editsRemaining,str:a.str.slice(1)})}if(0!=a.editsRemaining){if("*"in a.node.edges)var s=a.node.edges["*"];else{s=new D.TokenSet;a.node.edges["*"]=s}if(0==a.str.length&&(s.final=!0),r.push({node:s,editsRemaining:a.editsRemaining-1,str:a.str}),a.str.length>1&&r.push({node:a.node,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)}),1==a.str.length&&(a.node.final=!0),a.str.length>=1){if("*"in a.node.edges)var l=a.node.edges["*"];else{l=new D.TokenSet;a.node.edges["*"]=l}1==a.str.length&&(l.final=!0),r.push({node:l,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)})}if(a.str.length>1){var c,u=a.str.charAt(0),d=a.str.charAt(1);d in a.node.edges?c=a.node.edges[d]:(c=new D.TokenSet,a.node.edges[d]=c),1==a.str.length&&(c.final=!0),r.push({node:c,editsRemaining:a.editsRemaining-1,str:u+a.str.slice(2)})}}}return n},D.TokenSet.fromString=function(e){for(var t=new D.TokenSet,n=t,r=0,a=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},D.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},D.Index.prototype.search=function(e){return this.query((function(t){new D.QueryParser(e,t).parse()}))},D.Index.prototype.query=function(e){for(var t=new D.Query(this.fields),n=Object.create(null),r=Object.create(null),a=Object.create(null),o=Object.create(null),i=Object.create(null),s=0;s1?1:e},D.Builder.prototype.k1=function(e){this._k1=e},D.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var a=0;a=this.length)return D.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},D.QueryLexer.prototype.width=function(){return this.pos-this.start},D.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},D.QueryLexer.prototype.backup=function(){this.pos-=1},D.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=D.QueryLexer.EOS&&this.backup()},D.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(D.QueryLexer.TERM)),e.ignore(),e.more())return D.QueryLexer.lexText},D.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(D.QueryLexer.EDIT_DISTANCE),D.QueryLexer.lexText},D.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(D.QueryLexer.BOOST),D.QueryLexer.lexText},D.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(D.QueryLexer.TERM)},D.QueryLexer.termSeparator=D.tokenizer.separator,D.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==D.QueryLexer.EOS)return D.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return D.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(D.QueryLexer.TERM),D.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(D.QueryLexer.TERM),D.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(D.QueryLexer.PRESENCE),D.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(D.QueryLexer.PRESENCE),D.QueryLexer.lexText;if(t.match(D.QueryLexer.termSeparator))return D.QueryLexer.lexTerm}else e.escapeCharacter()}},D.QueryParser=function(e,t){this.lexer=new D.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},D.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=D.QueryParser.parseClause;e;)e=e(this);return this.query},D.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},D.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},D.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},D.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case D.QueryLexer.PRESENCE:return D.QueryParser.parsePresence;case D.QueryLexer.FIELD:return D.QueryParser.parseField;case D.QueryLexer.TERM:return D.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new D.QueryParseError(n,t.start,t.end)}},D.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=D.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=D.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new D.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new D.QueryParseError(n,t.start,t.end)}switch(r.type){case D.QueryLexer.FIELD:return D.QueryParser.parseField;case D.QueryLexer.TERM:return D.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new D.QueryParseError(n,r.start,r.end)}}},D.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new D.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var a=e.peekLexeme();if(null==a){r="expecting term, found nothing";throw new D.QueryParseError(r,t.start,t.end)}if(a.type===D.QueryLexer.TERM)return D.QueryParser.parseTerm;r="expecting term, found '"+a.type+"'";throw new D.QueryParseError(r,a.start,a.end)}},D.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new D.QueryParseError(r,n.start,n.end)}else e.nextClause()}},D.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new D.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new D.QueryParseError(r,a.start,a.end)}else e.nextClause()}},D.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new D.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new D.QueryParseError(r,a.start,a.end)}else e.nextClause()}},void 0===(a="function"==typeof(r=function(){return D})?r.call(t,n,t,e):r)||(e.exports=a)}()},813:function(e){e.exports=function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=a,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var a=e.contentWindow;if(r=a.document,!a||!r)throw new Error("iframe inaccessible")}catch(o){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,a=!1,o=null,i=function i(){if(!a){a=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",i),r.getIframeContents(e,t,n))}catch(s){n()}}};e.addEventListener("load",i),o=setTimeout(i,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(r){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var a=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},i=t.querySelectorAll("iframe"),s=i.length,l=0;i=Array.prototype.slice.call(i);var c=function(){--s<=0&&o(l)};s||c(),i.forEach((function(t){e.matches(t,a.exclude)?c():a.onIframeReady(t,(function(e){n(t)&&(l++,r(e)),c()}),c)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var a=!1,o=!1;return r.forEach((function(e,t){e.val===n&&(a=t,o=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==a||o?!1===a||o||(r[a].handled=!0):r.push({val:n,handled:!0}),!0):(!1===a&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var a=this;e.forEach((function(e){e.handled||a.getIframeContents(e.val,(function(e){a.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,a){for(var o=this,i=this.createIterator(t,e,r),s=[],l=[],c=void 0,u=void 0,d=function(){var e=o.getIteratorNode(i);return u=e.prevNode,c=e.node};d();)this.iframes&&this.forEachIframe(t,(function(e){return o.checkIframeFilter(c,u,e,s)}),(function(t){o.createInstanceOnIframe(t).forEachNode(e,(function(e){return l.push(e)}),r)})),l.push(c);l.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(s,e,n,r),a()}},{key:"forEachNode",value:function(e,t,n){var r=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),i=o.length;i||a(),o.forEach((function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,(function(){--i<=0&&a()}))};r.iframes?r.waitForIframes(o,s):s()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var a=!1;return n.every((function(t){return!r.call(e,t)||(a=!0,!1)})),a}return!1}}]),e}(),o=function(){function o(e){t(this,o),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(o,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var a in t)if(t.hasOwnProperty(a)){var o=t[a],i="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(a):this.escapeStr(a),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==i&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(i)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynomyms(i)+"|"+this.processSynomyms(s)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":"\x01"}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":"\x02"}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105","A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010d","C\xc7\u0106\u010c","d\u0111\u010f","D\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119","E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012b","I\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142","L\u0141","n\xf1\u0148\u0144","N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014d","O\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159","R\u0158","s\u0161\u015b\u0219\u015f","S\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163","T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016b","U\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xff","Y\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017a","Z\u017d\u017b\u0179"]:["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010dC\xc7\u0106\u010c","d\u0111\u010fD\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012bI\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142L\u0141","n\xf1\u0148\u0144N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014dO\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159R\u0158","s\u0161\u015b\u0219\u015fS\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016bU\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xffY\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017aZ\u017d\u017b\u0179"],r=[];return e.split("").forEach((function(a){n.every((function(n){if(-1!==n.indexOf(a)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xa1\xbf",r=this.opt.accuracy,a="string"==typeof r?r:r.value,o="string"==typeof r?[]:r.limiters,i="";switch(o.forEach((function(e){i+="|"+t.escapeStr(e)})),a){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr(n)))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var a=t.callNoMatchOnInvalidRanges(e,r),o=a.start,i=a.end;a.valid&&(e.start=o,e.length=i-o,n.push(e),r=i)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,a=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?a=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:a}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,a=!0,o=n.length,i=t-o,s=parseInt(e.start,10)-i;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(a=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:a}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return a.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",a=e.splitText(t),o=a.splitText(n-t),i=document.createElement(r);return i.setAttribute("data-markjs","true"),this.opt.className&&i.setAttribute("class",this.opt.className),i.textContent=a.textContent,a.parentNode.replaceChild(i,a),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,a){var o=this;e.nodes.every((function(i,s){var l=e.nodes[s+1];if(void 0===l||l.start>t){if(!r(i.node))return!1;var c=t-i.start,u=(n>i.end?i.end:n)-i.start,d=e.value.substr(0,i.start),p=e.value.substr(u+i.start);if(i.node=o.wrapRangeInTextNode(i.node,c,u),e.value=d+p,e.nodes.forEach((function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=u),e.nodes[n].end-=u)})),n-=u,a(i.node.previousSibling,i.start),!(n>i.end))return!1;t=i.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,a){var o=this,i=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var a=void 0;null!==(a=e.exec(t.textContent))&&""!==a[i];)if(n(a[i],t)){var s=a.index;if(0!==i)for(var l=1;l{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),s=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);x+=E.value.length,E=E.next){var S=E.value;if(t.length>e.length)return;if(!(S instanceof a)){var _,C=1;if(b){if(!(_=o(k,x,e,v))||_.index>=e.length)break;var T=_.index,R=_.index+_[0].length,A=x;for(A+=E.value.length;T>=A;)A+=(E=E.next).value.length;if(x=A-=E.value.length,E.value instanceof a)continue;for(var L=E;L!==t.tail&&(Ad.reach&&(d.reach=O);var D=E.prev;if(N&&(D=l(t,D,N),x+=N.length),c(t,D,C),E=l(t,D,new a(p,g?r.tokenize(P,g):P,y,P)),I&&l(t,E,I),C>1){var M={cause:p+","+m,reach:O};i(e,t,n,E.prev,x,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var s=p(/^\{$/,/^\}$/);if(-1===s)continue;for(var l=n;l=0&&f(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function c(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,l(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function u(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=l(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=s(i++,r)););return u[n]=a,n})).join(""),n,r),p=Object.keys(u);return i=0,function e(t){for(var n=0;n=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=p[i],o="string"==typeof r?r:r.content,s=o.indexOf(a);if(-1!==s){++i;var l=o.substring(0,s),d=c(u[a]),f=o.substring(s+a.length),m=[];if(l&&m.push(l),m.push(d),f){var h=[f];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},s=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var l=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(l=i(t[r-1])+l,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",l,null,l)}a.content&&"string"!=typeof a.content&&s(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=o.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++a;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),v=p.substring(m+f.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),v&&b.push.apply(b,i([v])),"string"==typeof c?s.splice.apply(s,[l,1].concat(b)):c.content=b}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var s={},l=e[r];if(l){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in a(t,o),s[t]=!0,n[t])s[i]=!0}t(l.require,c),t(l.optional,c),t(l.modify,c)}n[r]=s,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(l);i=i.map(c),s=(s||[]).map(c);var u=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(l),m=u;a(m);){for(var h in p={},m){var g=l[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var v in d)if(!(v in u))for(var b in f(v))if(b in u){p[v]=!0;break}for(var y in m=p)u[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,s={},l={};function c(e){if(e in s)return s[e];l[e]=!0;var a,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)a=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete l[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return s[e]=a}for(var u in n)c(u);var d=[];for(var p in l)d.push(s[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n