diff --git a/_data/navigation.yml b/_data/navigation.yml index a4364d3..6a03fc8 100644 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -66,44 +66,46 @@ - title: Building Applications items: - - title: Introduction - url: /building-apps-intro + # - title: Introduction + # url: /building-apps-intro + - title: Creating an App + url: /building-apps-create-new + # - title: Creating an App Manifest - NEEDED FOR REDIRECT + # url: /building-apps-define-manifest + - title: Managing App Collaboration + url: /building-apps-manage-collabs - title: Understanding App Types url: /building-apps-app-types - title: App Installation Architecture url: /building-apps-install-arch - - title: App Versioning and Update Notification - url: /building-apps-versioning - - title: Creating a New App - url: /building-apps-create-new - - title: Creating an App Manifest - url: /building-apps-define-manifest - - title: Understanding URL Parameter Interpolation - url: /building-apps-url-parameter-interpolation - - title: Building Procore Embedded Full Screen Applications + - title: Building User Level Auth. Apps + url: /building-data-connection-apps-auth + - title: Building Service Account Auth. Apps + url: /building-data-connection-apps + - title: Building Full Screen Embedded Apps url: /building-embedded-fullscreen-apps - - title: Building Procore Embedded Side Panel Applications + - title: Building Side Panel Embedded Apps url: /building-side-panel-apps - - title: Building Procore Data Connection Applications with DMSA - url: /building-data-connection-apps - - title: Installing an App in the Development Sandbox - url: /building-apps-sandbox-install - - title: Promoting a Sandbox Manifest to Production + - title: Understanding URL Parameter Interpolation + url: /building-apps-url-parameter-interpolation + # - title: Installing an App in the Development Sandbox + # url: /building-apps-sandbox-install + - title: Managing App Versions & Update Notifications url: /building-apps-promote-manifest + # - title: App Versioning and Update Notification - NEEDED FOR REDIRECT + # url: /building-apps-versioning # - title: Submitting a Production App Manifest for Review # url: /building-apps-review-manifest - ACTION REQUIRED - Updated for Redirect # - title: Creating a Marketplace Listing and Submitting for Review # url: /building-apps-submit-marketplace - ACTION REQUIRED - Updated for Redirect - - title: Managing App Collaboration - url: /building-apps-manage-collabs # - title: Working with App Metrics # url: /building-apps-metrics - Updated for Redirect - title: Developer Managed Service Accounts url: /developer-managed-service-accounts - - title: App Manifest v3.x Legacy Format - url: /building-apps-legacy-v3x-manifest-format - - title: Migrating an App Manifest from v3.x to v4.1 - url: /building-apps-v3x-v41-manifest-migration + # - title: App Manifest v3.x Legacy Format - NOT NEEDED ANYMORE + # url: /building-apps-legacy-v3x-manifest-format + # - title: Migrating an App Manifest from v3.x to v4.1 - NOT NEEDED ANYMORE + # url: /building-apps-v3x-v41-manifest-migration # - title: Maximizing Conversation Rates # url: /building-apps-maximizing-conversion-rates - Updated for Redirect @@ -264,4 +266,6 @@ - title: New Rest V2 Version url: /new-rest-v2-version - title: Service Account Deprecation - url: /service-account-deprecation \ No newline at end of file + url: /service-account-deprecation + # - title: API Usage in Developer Portal + # url: /api-activity-export \ No newline at end of file diff --git a/_includes/setup_instructions.md b/_includes/setup_instructions.md index 7376f31..5c604d8 100644 --- a/_includes/setup_instructions.md +++ b/_includes/setup_instructions.md @@ -1,14 +1,15 @@ +## Define Setup Instructions and Post‑Installation Notes -## Define Setup Instructions and Post-Installation Notes +You must provide setup instructions and post-installation notes to help Procore users complete the installation and setup of your application in a Procore project. -You can define additional setup instructions and post-installation notes to help Procore users successfully install and set up your application within a Procore project. -Setup instructions and post-installtion notes are a great way to let your users know that there may be addtional steps required for them to properly install and set up your application. -For example, Procore users installing your application may need to go through a signup process, establish an account, or configure some settings on your platform before completing the application setup. -Instructions are displayed to the user once an application is installed, and are accessible later from within the App Management feature in the Procore Admin tool. +Clear post-installation guidance is required to ensure users know exactly what to do after installing your app. For example, they may need to sign up for an external account, configure settings on your platform, or complete authentication steps before the app can be used. -1. Expand the Instructions and Post-Installation Notes section. -2. In the Instructions URL field, enter the web address for your company support site, or web-based installation steps for your application. -3. In the Instructions Page Name field, enter the label you want to use for the hyperlink text for the Instructions URL you defined in step 2. -4. In the Post-Installation Notes field, provide a textual description of any post-installation steps required to properly complete the setup of your application. +These instructions are displayed to the user immediately after installation and remain accessible in the App Management section of the Procore Admin Tool. -![Post Install Steps]({{ site.baseurl }}/assets/guides/form-based-post-install-steps.png) \ No newline at end of file +To populate the install notes, expand the **Instructions and Post-Installation Notes** section, and follow these steps to define setup instructions: + +1. In the **Instructions URL** field, enter a link to your company’s support site or a page with step-by-step setup instructions. +2. In the **Instructions Page Name** field, enter the label you want to display as the hyperlink text for the Instructions URL. +3. In the **Post-Installation Notes** field, add any additional details or reminders the users need to complete setup successfully. + +![Post Install Steps]({{ site.baseurl }}/assets/guides/app-install-instructions-final.png) \ No newline at end of file diff --git a/_includes/url_parameter_interpolation.md b/_includes/url_parameter_interpolation.md index 50847b4..8168a65 100644 --- a/_includes/url_parameter_interpolation.md +++ b/_includes/url_parameter_interpolation.md @@ -1,42 +1,72 @@ -_URL Parameter Interpolation_ is a method used in web development to insert variable data into a URL. -In the context of a Procore integration application, it is used to add specific values to the URL that can then be used to request specific data from the application server. -This technique is often used in HTTP GET requests, where data is passed as parameters in the URL itself. +## Introduction +_URL Parameter Interpolation_ lets you insert dynamic, context-specific values into a URL. In Procore embedded applications, this is how you make your app respond to the **current company** or **project context** without hardcoding values. -Interpolation comes into play when these parameter values are dynamic - that is, they change based on user input or some other variable. -Developers can use interpolation to insert these variable values into the URL. -The Procore platform supports URL parameter interpolation for different sections of the URL, which you define when adding a component. -You can interpolate values for the URL subdomain, path parameters, and query parameters. -For example: +This is commonly used in HTTP GET requests, where data is passed in the URL. Interpolation makes these values dynamic-changing based on the user's context or custom setup. -**Subdomain** +--- +## Where Interpolation Works in Procore +You can use interpolation when defining a component in the Developer Portal in the following parts of a URL: +- **Subdomain** +- **Path parameters** +- **Query parameters** + +This is most common in HTTP GET requests, where data is passed in the URL. + +--- + +## Examples + +**Subdomain:** Pass a value into the subdomain dynamically. ```{% raw %} https://{{subdomain}}.domain.com ```{% endraw %} -**Path Parameters** - -```{% raw %} +**Path Parameters:** Insert dynamic values directly into the path. +```{% raw %} https://example.domain.com/{{my_path1}}/{{my_path2}} ```{% endraw %} -**Query Parameters** - -```{% raw %} -?companyId={{procore.company.id}}&companyName={{procore.company.name}}&projectId={{procore.project.id}}&projectName={{procore.project.name}}&customField={{CustomField}} +**Query Parameters:** Send company or project context (and more) as query string values. +```{% raw %} +?companyId={{procore.company.id}}&projectId={{procore.project.id}}&customField={{CustomField}} ```{% endraw %} -The Procore platform provides the following built-in variables for use as query parameters. +--- + +## Built-in Variables +Procore provides built-in variables you can use in query parameters to automatically pass context: + +- `procore.company.id` – ID of the company where the app is installed +- `procore.company.name` – Name of that company +- `procore.project.id` – ID of the project where the app is used +- `procore.project.name` – Name of that project + +**Why use them?** +These variables save time and prevent mistakes. For example, use `procore.project.id` to fetch project-specific data from your system without asking the user to enter it. + +--- + +## Custom Parameters +You can also create your own parameters to meet specific needs. These are defined by the installer during app setup and can be required or optional. + +**Common use cases:** +- Link to a device ID (e.g., drone, camera). +- Pass a subscription or user ID. +- Set a region or locale for the app. + +--- + +## How to Add Custom URL Parameters + +1. In your component configuration, click **Add Parameter**. + ![Component Add Param]({{ site.baseurl }}/assets/guides/form-based-component-add-param.png) + +2. Define the **Name**, **Type**, **Key**, and **Description**. + ![Component Add Param Field]({{ site.baseurl }}/assets/guides/form-based-component-add-param-custom.png) -* `procore.company.id` - ID of the company where the App is installed. -* `procore.company.name` - Name of the company where the App is installed. -* `procore.project.id` - ID of the project in which the App has been configured. -* `procore.project.name` - Name of the project in which the App has been configured. +3. Mark the parameter as **Required** (or leave it optional) for installation. -When included as URL parameters for your embedded (full screen or side panel) application, these values can be used to determine which company and project a user is working in. -The `procore.project.id` variable is commonly used in scenarios where data for the same Procore project lives in an external system and allows the embedded application to access the externally mapped/synced project. +4. Click **Save Parameter**. -You can also define your own custom field variables for use as query parameters. -Custom field variables can be specified as required _or_ optional. -Values for custom parameters are set by the user during installation allowing you further personalize your application. -Custom parameters are extremely flexible and can be used for any number of purposes. Some common uses for custom parameters include entering an ID number for a specific device in a drone/site camera application, specifying a membership or subscription ID for an application, or defining the locale in which an application will be used. +Once saved, your custom parameter can be used in the URL the same way as built-in variables—helping your app deliver the right data in the right context. diff --git a/announcements/app_performance_metrics.md b/announcements/app_performance_metrics.md new file mode 100644 index 0000000..d04dcfe --- /dev/null +++ b/announcements/app_performance_metrics.md @@ -0,0 +1,57 @@ +--- +permalink: /api-activity-export +title: Export API Activity for Your App +sub_header: Learn how to generate a 30-day summary of your app’s API usage to monitor behavior, debug issues, and improve performance. +layout: default +section_title: App Management & Monitoring +--- + +## Introduction +The **Performance Metrics** tab is now available for all apps in the Procore Developer Portal—covering both **Custom Apps** and **Marketplace Apps**. + +This feature gives you direct access to a **30-day CSV export** of your app’s API activity in the production environment. It’s designed to help you quickly understand how your app is using Procore APIs, so you can troubleshoot issues, optimize performance, and track usage trends. +

+ +*** +## Why This Matters +Before this update, app performance data was limited and not universally available. Now, you can: + +- **Optimize efficiency** – See which endpoints are called most often and reduce unnecessary calls. +- **Troubleshoot issues faster** – Identify failed requests and when they occurred. +- **Validate expected behavior** – Confirm your app is making the right calls at the right time. +- **Track usage trends** – Monitor daily API activity to spot anomalies or spikes. +

+ +*** +## How It Works +1. **Open the Performance Metrics tab** + - In the Developer Portal, navigate to your app and click the **Performance Metrics** tab. +2. **Request your API activity CSV** + - Click **Generate CSV Export**. + - You’ll receive an email with your CSV file attached. +3. **Review your API activity** + - The CSV includes the last 30 days of your app’s **production** API calls, organized by day. +

+ +*** +## What’s in the CSV + +| Column | Description | +|--------------------|-----------------------------------------------------------------------------| +| Date | The date of activity | +| Response Code | Indicates whether the call was successful or failed | +| HTTP Method | The HTTP method used (GET, POST, PUT, DELETE, etc.) | +| Normalized Route | The standardized API route (e.g., `/v1.0/projects/:project_id/observations`)| +| Count | The total number of calls for that route, method, and status on that day | + +
+
+ +*** +## Tips for Using This Data +- **Spot errors quickly** – Filter by failed calls to identify problem endpoints. +- **Improve performance** – Reduce unnecessary calls to high-traffic endpoints. +- **Monitor adoption** – See if your most important features are being used. +- **Detect unusual patterns** – Look for spikes or drops in usage that may indicate issues. + +By regularly reviewing your app’s API activity, you can maintain reliability, improve user experience, and ensure efficient API usage. \ No newline at end of file diff --git a/assets/guides/app-install-instructions-final.png b/assets/guides/app-install-instructions-final.png new file mode 100644 index 0000000..50ccf00 Binary files /dev/null and b/assets/guides/app-install-instructions-final.png differ diff --git a/assets/guides/app-install-instructions.png b/assets/guides/app-install-instructions.png new file mode 100644 index 0000000..537c08c Binary files /dev/null and b/assets/guides/app-install-instructions.png differ diff --git a/assets/guides/app-install-instructions2.png b/assets/guides/app-install-instructions2.png new file mode 100644 index 0000000..667b4f6 Binary files /dev/null and b/assets/guides/app-install-instructions2.png differ diff --git a/building_applications/building_apps_create_new.md b/building_applications/building_apps_create_new.md index fb45ecb..440ec14 100644 --- a/building_applications/building_apps_create_new.md +++ b/building_applications/building_apps_create_new.md @@ -1,40 +1,66 @@ --- permalink: /building-apps-create-new -title: Creating a New App +title: Creating an App +sub_header: Set up your account, build your first app, and configure your App Manifest to start developing in Procore. layout: default section_title: Building Applications - --- -Once you have registered your Developer Account you can create a new App in the Procore Developer Portal. -The following steps show you how to properly navigate the Developer Portal and successfully create a new App. +## Introduction +Whether you're a Procore customer or a Technology Partner, you can use the Procore Developer Portal to build apps that embed external systems in Procore or interact directly with its API. This guide walks you through creating your Developer Portal account and building your first app. +

+ +*** +## 1. Create an Account +Start by registering for a Procore Developer Portal account. Once registered, you can create your first app. + +1. Open your browser and go to the Developer Portal. +2. Click **Sign Up** and fill out the required fields: first name, last name, and email. +3. Set and confirm your password. +4. (Optional) Enter your company name. +5. Complete the reCAPTCHA. +6. Click **Create Free Account**, then check your inbox for a verification email. +

+ +*** +## 2. Create an App +Follow these steps to create a new app in the Developer Portal: + +1. Go to the Developer Portal and sign in to your account. +2. Navigate to the **My Apps** page and click **Create a New App**. +3. Enter an app name. The first name you choose is important, so label it carefully. +4. Click **Create**. + +When you create a new app, a Developer Sandbox is automatically provisioned for building and testing with sample project data. You can access it by checking the **OAuth Credentials** section of your app or by following the link in the email sent to the app creator. + +For detailed instructions on installing your app in the Developer Sandbox, see Install a Custom App. +

-1. Open your browser and navigate to the [Developer Portal](https://developers.procore.com/) landing page. -1. Click **Sign In** to log in to your Developer Portal account. -1. Navigate to the My Apps page and click **Create a New App**. The Create New App dialog displays. -1. Enter an App Name. This will be the name you use to refer to your application internally within your organization. -1. Click **Create**. You are presented with a new page for your App where you can configure a number of settings. +*** +## 3. App Manifest Overview +After creating your app, use the Configuration Builder to choose the components you want to include. These components define your app’s functionality in Procore and make up the App Manifest. Each saved set of changes becomes a new app version. -## Uploading an Avatar for your App (optional) +Based on the components you select, you can build: +- [User Level Authentication Apps]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_data_connection_apps_auth.md %}) +- [Service Account Authentication Apps]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_data_connection_apps.md %}) +- [Full Screen Embedded Apps]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_embedded_fullscreen_apps.md %}) +- [Side Panel Embedded Apps]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_side_panel_apps.md %}) -You have the option to upload an image to be used as the publicly-displayed avatar for your application. +You can also combine multiple app types in a single manifest. -1. In the App Settings card, do one of the following: - Click Attach File or Drag and Drop, select an image file to upload and click Open. - On your computer, locate and select the image and drag it to the App Settings card. -1. Click Update to save your changes. +### Create New Manifest Versions +After your initial version, you can continue iterating by creating new app versions: -## Log in to the Development Sandbox and Set Password +1. In the Configuration Builder, make any necessary changes, such as updating permissions or modifying components. +2. Click **Save Version** and enter a version number. +3. After saving, you'll receive a new Sandbox App Version Key. Use this key to install and test the new version in your Developer Sandbox. +4. When you are satisfied with the updates, click **Promote Version** to move it to production. -As part of the App creation process, we generate a development sandbox for you to use while you build and test your new App. -You will receive an email notifying you that your development sandbox is ready for use. -You will need to log in and set a password for your new development sandbox using the following steps. -(Note: the password link on the notification email expires after 24 hours.) +For more information on app versions, see [App Versioning and Update Notifications]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_versioning.md %}). +

-1. In the body of the notification email, click **Set My Sandbox Password**. You are redirected to the ‘Reset Password’ login page. -1. Enter a new password for your sandbox account, adhering to the password requirements listed on the page. -1. Re-enter your new password for confirmation and click **Set Password**. -1. After your password has been successfully reset, click **Back to Login**. -1. Log in to your development sandbox using your new sandbox account email and password. -1. Select the company associated with your App and click **Continue**. -1. Follow the on-screen directions for ‘Getting Started’. +*** +## Explore Our Resources +- [Managing App Collaborators]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_manage_collabs.md %}) +- [Understanding App Types]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_app_types.md %}) +- [Managing App Versions & Update Notifications]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}) \ No newline at end of file diff --git a/building_applications/building_apps_define_manifest.md b/building_applications/building_apps_define_manifest.md index a54b50d..8cabd90 100644 --- a/building_applications/building_apps_define_manifest.md +++ b/building_applications/building_apps_define_manifest.md @@ -5,7 +5,17 @@ layout: default section_title: Building Applications --- ->**Note:** This article covers topics consistent with the App Manifest v4.1 format. + + + + + + +

If you are not redirected, click here.

+ + + + diff --git a/building_applications/building_apps_define_manifest_v41.md b/building_applications/building_apps_define_manifest_v41.md index b61d7d7..9bd5456 100644 --- a/building_applications/building_apps_define_manifest_v41.md +++ b/building_applications/building_apps_define_manifest_v41.md @@ -5,7 +5,17 @@ layout: default section_title: Building Applications --- ->**Note:** This article covers topics consistent with the App Manifest v4.1 format. + + + + + + +

If you are not redirected, click here.

+ + + + diff --git a/building_applications/building_apps_intro.md b/building_applications/building_apps_intro.md index aee791e..a48e83d 100644 --- a/building_applications/building_apps_intro.md +++ b/building_applications/building_apps_intro.md @@ -6,8 +6,18 @@ section_title: Building Applications --- -Whether you are a Procore client or a Procore Technology partner, you can leverage the Procore API to build applications that interact directly with the data and resources available in Procore tools at both the company and project level. -The following sections detail the steps for building applications, or Apps, using the Procore API and provide you with the information you need to be successful in your development efforts. + + + + + + +

If you are not redirected, click here.

+ + + + \ No newline at end of file diff --git a/building_applications/building_apps_manage_collabs.md b/building_applications/building_apps_manage_collabs.md index 43dd2d6..c21e9ee 100644 --- a/building_applications/building_apps_manage_collabs.md +++ b/building_applications/building_apps_manage_collabs.md @@ -7,9 +7,6 @@ section_title: Building Applications --- ->**Note:** This article covers topics consistent with the App Manifest v4.1 format and the form-based app creation UI experience. ->For information on the App Manifest v3.x (legacy) format, see [App Manifest v3.x Legacy Format]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_legacy_v3x_manifest_format.md %}) and [Migrating an App Manifest from v3.x to v4.1]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_v3x_to_v4.1_manifest_migration.md %}). - ## Introduction If you're working with a team, the **Collaborators** feature allows you to manage access and responsibilities across your app. Each collaborator is assigned a role—Owner, Administrator, or Developer—which defines their permissions within the Developer Portal. diff --git a/building_applications/building_apps_promote_manifest.md b/building_applications/building_apps_promote_manifest.md index a5bd774..54e6b42 100644 --- a/building_applications/building_apps_promote_manifest.md +++ b/building_applications/building_apps_promote_manifest.md @@ -1,33 +1,54 @@ --- permalink: /building-apps-promote-manifest -title: Promoting a Sandbox Manifest to Production +title: Managing App Versions & Update Notifications +sub_header: Understand how versioning impacts your app’s lifecycle, and how updates are surfaced to Procore users. layout: default section_title: Building Applications --- ->**Note:** This article covers topics consistent with the App Manifest v4.1 format and the form-based app creation UI experience. ->For information on the App Manifest v3.x (legacy) format, see [App Manifest v3.x Legacy Format]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_legacy_v3x_manifest_format.md %}) and [Migrating an App Manifest from v3.x to v4.1]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_v3x_to_v4.1_manifest_migration.md %}). +## Introduction +After creating an app, you can modify its components using the Configuration Builder. This page explains how to promote an app version to Production and how these updates are delivered to customers. Each saved set of changes creates a new App Version. -## Promoting a Manifest Version to Production +*** +## Versioning Your App +When you are ready to release a new app version, promote it to Production and include release notes that describe what has changed. These notes appear to Procore Company Admins during the update process and—if your app is listed on the Marketplace—also appear on your Marketplace listing. -When you are ready to release your new application version to production, you can promote the new manifest version and enter release notes that describe the changes being deployed. -When a Procore company administrator installs the updated version of your application in their account, the release notes are displayed in a modal so they can review the changes and decide whether they want to proceed with the installation. -Be sure to provide detailed and accurate information in your release notes. -The following diagram shows a simplified view of the manifest versioning model.* +Use clear and accurate release notes to help users understand what is new or changed. -![App manifest diagram]({{ site.baseurl }}/assets/guides/manifest-promotion.png) +### Semantic Versioning +Procore apps use [semantic versioning](https://semver.org/) to track changes: -*Version number objects in the diagram represent semantic (x.y.z) versions. +`X.Y.Z` +- **X** (Major): Breaking Changes. +- **Y** (Minor): Backward-Compatible Feature Additions. +- **Z** (Patch): Bug Fixes or Minor Improvements. -You can create new working sandbox versions of your manifest, and then promote specific versions to production as needed. -After you are satisfied with the content in your manifest and you are ready to work with your App in a production environment, complete the following steps to promote the manifest. +**Versioning tips:** +- Begin development with `v0.0.1`. +- Use `v1.0.0` for your first public release. +- Only increment the major version for breaking changes. -1. On the Manage App page, select the 'Configuration Builder'. -2. Click **Promote Version** +![App Manifest promotion diagram]({{ site.baseurl }}/assets/guides/manifest-promotion.png) - ![Promote Button]({{ site.baseurl }}/assets/guides/form-based-promote.png) +*** +## Promoting Your App & Notifying Users +After promoting a version to Production, Procore notifies customers when an update is available. Company Admins will see an **"Update Available"** badge in the App Management section of the Company Admin Tool. -3. Enter release notes for the new version and click **Promote**. +> Important: Customer app settings—such as which projects the app is applied to—do not carry over automatically. Make sure to account for this when releasing updates. - ![Promote confirm dialog]({{ site.baseurl }}/assets/guides/promote-manifest-confirm.png) + + +### Promotion Steps + +1. Open the Configuration Builder on the Manage App page. +2. Click **Promote Version**. +3. Add release notes. +4. Click **Promote**. + +- For custom apps, update notifications are sent automatically after promotion. +- For Marketplace apps, updates must be approved before notifications are sent to customers. + +![App Update Available]({{ site.baseurl }}/assets/guides/update-available-badge.png) + +See [Update an Installed App](https://support.procore.com/products/online/user-guide/company-level/admin/tutorials/update-installed-app) for more information. \ No newline at end of file diff --git a/building_applications/building_apps_versioning.md b/building_applications/building_apps_versioning.md index c5ec5b9..d6dbefc 100644 --- a/building_applications/building_apps_versioning.md +++ b/building_applications/building_apps_versioning.md @@ -6,7 +6,17 @@ section_title: Building Applications --- -## Semantic Versioning + + + + + + +

If you are not redirected, click here.

+ + + + diff --git a/building_applications/building_data_connection_apps.md b/building_applications/building_data_connection_apps.md index 6e16085..82cf238 100644 --- a/building_applications/building_data_connection_apps.md +++ b/building_applications/building_data_connection_apps.md @@ -1,67 +1,54 @@ --- permalink: /building-data-connection-apps -title: Building Procore Data Connection Applications with DMSA +title: Building Service Account Authentication Applications layout: default section_title: Building Applications +sub_header: Learn how to build a data connection app using a Developer Managed Service Account (DMSA) for automated system-to-system data exchange. --- ->**Note:** This article covers topics consistent with the App Manifest v4.1 format. ->For information on the App Manifest v3.x (legacy) format, see [App Manifest v3.x Legacy Format]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_legacy_v3x_manifest_format.md %}) and [Migrating an App Manifest from v3.x to v4.1]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_v3x_to_v4.1_manifest_migration.md %}). +## Introduction +This guide provides step-by-step instructions for building a data connection app using Service Account Authentication (OAuth 2.0 Client Credentials). This method allows your integration to interact with the Procore API using system credentials—without requiring user login. These apps use Procore's Developer Managed Service Account (DMSA) model and are ideal for server-to-server communication. -## Overview - -The following sections provide step-by-step instructions for creating a new data connection app manifest that utilizes a [Devloper Managed Service Account (DMSA)]({{ site.url }}{{ site.baseurl }}{% link building_applications/developer_managed_service_accounts.md %}). -This article provides details on the following steps for creating a new data connection application: - -* [Create a New Application](#create-a-new-application) -* [Specify Tool Permissions Using Permission Builder](#specify-tool-permissions-using-permission-builder) -* [Define Setup Instructions and Post-Installation Notes](#define-setup-instructions) -* [Save Manifest and Create Version](#save-manifest-and-create-version) -* [Promote Updated Sandbox Manifest to Production](#promote-updated-sandbox-manifest-to-production) - - -{% include create_application.md %} +To get started, first [create a Developer Portal account and app]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_create_new.md %}). +

+*** ## Add a New Data Connector Component - -Data connector components define how your app syncs data with Procore. -Data connector components enable you to create, update, and read data from Procore to the connected platform through a Client ID and Client Secret. -Select between User Level Authentication, Service Account Authentication, or both based on your app's functionality and security requirements. - -1. Navigate to the Configuration Builder and expand the Data Connector Components section. +1. In your Developer Portal app, expand the **Data Connector Components** section. 2. Click **Add Components**. -3. Choose a Component Type: - - User Level Authentication - The integration will interact on behalf of a user and limit the API response body based on their Procore permissions (OAuth 2.0 authorization code). - - Service Account Authentication - The integration will use a (DMSA) service account (OAuth 2.0 Client Credentials). -4. Selecting the Service Account Authentication component type displays a permissions builder where you can define the company level and project level tool permissions required to install and use your integration. Refer to the [User Permissions Matrix](https://support.procore.com/references/user-permissions-matrix-web) for additional information. - - ![Permission Builder]({{ site.baseurl }}/assets/guides/form-based-manifest-dmsa-perms-builder.png) +3. Select **Service Account Authentication** and **User Level Authentication**. + - This option uses a Developer Managed Service Account (DMSA) and the OAuth 2.0 Client Credentials Flow to allow system-level access. +4. Use the **Permissions Builder** to define the required company- and project-level tool permissions your app needs. + - Refer to the [User Permissions Matrix](https://support.procore.com/references/user-permissions-matrix-web) for more details. +5. Click **Save Component**. -4. On the Company tab, define the required permission levels (Read Only, Standard, or Admin) for each Company level tool that is accessed by your app. -5. Repeat the previous step on the Project tab to define Project level tool permissions. -6. Click **Save Component**. -Your data connector component is updated with the permissions you defined in the permissions builder. +![Permission Builder]({{ site.baseurl }}/assets/guides/form-based-manifest-dmsa-perms-builder.png) +

+***
{% include setup_instructions.md %} +

-## Create Intitial App Manifest Version +*** +## Create the Initial App Manifest Version +After configuring your component, you're ready to save your first app version. -After completing the steps above, you're ready to save your app configuration in the App Manifest and set the initial version number. 1. In the Configuration Builder, click **Create Version**. -2. Enter a version number using the following syntax: **x.x.x.** -For example, '1.1.1'. -Each new version you create must be a higher number than the previous version. +2. Enter a semantic version number (e.g., `0.1.0`). + - For details, see [Managing App Versions & Update Notifications]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}). 3. Click **Create**. -The new version is saved with a status of `Ready for Testing`. - -[As you make ongoing changes to the app configuration during development, you can save these changes as new versions using the **Save Version** button.] - -## Test and Validate in Development Sandbox -We recommend testing and validating each version of your application in the development sandbox environment. See [Installing an Application in the Development Sandbox]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_sandbox_install.md %}) for additional information. +The version will be saved with the status **Ready for Testing**. As you continue development, click **Save Version** to capture changes. +

-## Promote Updated Sandbox Manifest to Production +*** +## Test and Validate in the Development Sandbox +Test and validate each version of your app in your Development Sandbox before releasing it to production. +See [Installing an Application in the Development Sandbox]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_sandbox_install.md %}) for step-by-step instructions. +

-After you have successfully tested and validated your updated manifest in the development sandbox environment, you can promote it to the production environment. -See [Promoting a Sandbox Manifest to Production]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}) for additional information. +*** +## Promote the Updated Sandbox Manifest to Production +Once you're satisfied with testing, promote your sandbox version to production. +See [Managing App Versions & Update Notifications]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}) to learn how. diff --git a/building_applications/building_data_connection_apps_auth.md b/building_applications/building_data_connection_apps_auth.md new file mode 100644 index 0000000..adb2810 --- /dev/null +++ b/building_applications/building_data_connection_apps_auth.md @@ -0,0 +1,50 @@ +--- +permalink: /building-data-connection-apps-auth +title: Building User Level Authentication Applications +sub_header: Learn how to build a data connection app using User Level Authentication (OAuth 2.0) to act on behalf of a Procore user. +layout: default +section_title: Building Applications +--- + +## Introduction +This guide provides step-by-step instructions for building a data connection app using User Level Authentication (OAuth 2.0 Authorization Code Flow). This method allows your integration to act on behalf of a specific user, enabling secure data exchange between Procore and an external platform using a Client ID and Client Secret. + +To get started, first [create a Developer Portal account and app]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_create_new.md %}). +

+ +*** +## Add a New Data Connector Component +1. In your Developer Portal app, expand the **Data Connector Components** section. +2. Click **Add Components**. +3. Select **User Level Authentication**. + - This option uses OAuth 2.0 Authorization Code Flow to act on behalf of a user. API responses are limited by the user’s permissions in Procore. +4. Click **Save Component**. +

+ +*** + +{% include setup_instructions.md %} +

+ +*** +## Create the Initial App Manifest Version +After configuring your component, you're ready to save your first app version. + +1. In the Configuration Builder, click **Create Version**. +2. Enter a semantic version number (e.g., `0.1.0`). + - For details, see [Managing App Versions & Update Notifications]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}). +3. Click **Create**. + +The version will be saved with the status **Ready for Testing**. As you continue development, click **Save Version** to capture changes. +

+ +*** +## Test and Validate in the Development Sandbox +Test and validate each version of your app in your Development Sandbox before releasing it to production. +See [Installing an Application in the Development Sandbox]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_sandbox_install.md %}) for step-by-step instructions. +

+ +*** +## Promote the Updated Sandbox Manifest to Production +Once you're satisfied with testing, promote your sandbox version to production. +See [Managing App Versions & Update Notifications]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}) to learn how. diff --git a/building_applications/building_embedded_fullscreen_apps.md b/building_applications/building_embedded_fullscreen_apps.md index 50ac49f..2cf9a61 100644 --- a/building_applications/building_embedded_fullscreen_apps.md +++ b/building_applications/building_embedded_fullscreen_apps.md @@ -1,88 +1,61 @@ --- permalink: /building-embedded-fullscreen-apps -title: Building Procore Full Screen Applications +title: Building Full Screen Embedded Applications +sub_header: Learn how to build and configure a full screen embedded application in the Procore Developer Portal. layout: default section_title: Building Applications --- ->**Note:** This article covers topics consistent with the App Manifest v4.1 format. ->For information on the App Manifest v3.x (legacy) format, see [App Manifest v3.x Legacy Format]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_legacy_v3x_manifest_format.md %}) and [Migrating an App Manifest from v3.x to v4.1]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_v3x_to_v4.1_manifest_migration.md %}). +## Introduction +This guide walks you through building a full screen embedded application in Procore. Embedded apps appear directly within the Procore user interface, enabling seamless user workflows without switching between platforms. These apps are defined using the Procore App Manifest and configured through the Developer Portal’s Configuration Builder. -## Overview +To get started, first [create a Developer Portal account and app]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_create_new.md %}). +

-With the Procore platform, developers have the capability to develop and deploy embedded Apps that display directly within the Procore user interface. -This embedded functionality benefits the end user by enabling streamlined and more efficient workflows. -With an embedded App, the user does not need to constantly switch between Procore and another application, resulting in a more unified and improved user experience. -The behavior and settings for embedded applications are defined in the App manifest. - -This article provides details on the following steps for building a full screen (embedded) application: - -* [Create a New Application](#create-a-new-application) -* [Add a Full Screen Component](#add-a-full-screen-component) - * [Specify Component Type and Application URL](#1-specify-component-type-and-application-url) - * [Define Parameter Interpolation](#2-define-parameter-interpolation) - * [Save the New Component](#3-save-the-new-component) -* [Define Setup Instructions and Post-Installation Notes](#define-setup-instructions) -* [Save Manifest and Create Version](#save-manifest-and-create-version) -* [Test and Validate in Development Sandbox](#test-and-validate-in-development-sandbox) -* [Promote Updated Sandbox Manifest to Production](#promote-updated-sandbox-manifest-to-production) - - -{% include create_application.md %} - -## Add a Full Screen Component - -The first step in configuring your new full screen embedded application is to add a _component_. -Note that only full screen embedded and side panel applications require that components be defined. -If you are building a data connection application based on developer managed service accounts (DMSA), you do not need to add a component in the Configuration Builder. -See [Understanding App Types]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_app_types.md %}) for additional information on application types and components. -Follow these steps to add a new full screen component. +*** +## Add a New Full Screen Component +Full screen apps require a URL to define which page appears in the Procore UI. Follow the steps below to configure a full screen component. ### 1. Specify Component Type, Description, and Application URL - -* Navigate to the Configuration Builder on the Manage App page, expand the Components section and click **Add Component**. -* Using the drop-down, select **Full Screen** for the component Type. -* Enter a Description for the component. This is a custom description used solely as an identifier. -* In the URL field, specify the base web address for your application. (e.g., https://example.com/1234/12). - - ![Component Type and App URL]({{ site.baseurl }}/assets/guides/form-based-component-type-url-fields-fs.png) +1. In the Configuration Builder on the Manage App page, expand the **Components** section and click **Add Component**. +2. From the drop-down list, select **Full Screen** for the Type. +3. In the URL field, enter the base web address for your application (e.g., `https://example.com/1234/12`). ### 2. Define Parameter Interpolation +URL parameter interpolation allows you to insert variable data into a URL. In the context of Procore embedded applications, this technique passes dynamic values into the app’s URL so the app can respond to specific company or project contexts. -{% include url_parameter_interpolation.md %} - -* Add one or more custom URL Parameters to the component by clicking **Add Parameter**. - - ![Component Add Param]({{ site.baseurl }}/assets/guides/form-based-component-add-param.png) - -* Define the Name, Type, Key, and Description for the custom parameter. -* Specify whether the parameter is required at time of installation. +This is commonly used in HTTP GET requests, where data is passed in the URL. Interpolation makes these values dynamic—changing based on the user’s context or custom setup. - ![Component Add Param Field]({{ site.baseurl }}/assets/guides/form-based-component-add-param-custom.png) - -* Click **Save Parameter**. +To learn more about this feature, see [Understanding URL Parameter Interpolation]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_url_parameter_interpolation.md %}). ### 3. Save the New Component +After defining the component type, application URL, and URL parameter(s), click **Save Component**. +

-* Once you have successfully created a new full screen component and defined the component Type, application URL, and URL Parameter(s), click **Save Component**. - - ![Component Save]({{ site.baseurl }}/assets/guides/form-based-component-save.png) - +*** {% include setup_instructions.md %} - -## Save Manifest and Create Version - -After completing the steps above, you're ready to save your application configuration and set your first version number. -1. Click **Save** at the top of the page. -2. The **Create Version** window appears. Enter a version number using the following syntax: **x.x.x** -Note: Your version number can only contain integers, and must consist of three (3) integers separated by a '.'. For example, '1.1.1'. Each new version you create must be a higher number than the previous version. - -## Test and Validate in Development Sandbox - -We recommend testing and validating each version of your application in the development sandbox environment. See [Installing an Application in the Development Sandbox]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_sandbox_install.md %}) for additional information. - -## Promote Updated Sandbox Manifest to Production - -After you have successfully tested and validated your updated manifest in the development sandbox environment, you can promote it to the production environment. -See [Promoting a Sandbox Manifest to Production]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}) for additional information. +

+ +*** +## Create the Initial App Manifest Version +After configuring your component, you're ready to save your app version. + +1. In the Configuration Builder, click **Create Version**. +2. Enter a semantic version number (e.g., `0.1.0`). + - For details, see [Managing App Versions & Update Notifications]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}). +3. Click **Create**. + +The version will be saved with the status **Ready for Testing**. As you continue development, click **Save Version** to capture new changes. +

+ +*** +## Test and Validate in the Development Sandbox +Test and validate each version of your app in your development sandbox before releasing it to production. +See [Installing an Application in the Development Sandbox]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_sandbox_install.md %}) for step-by-step instructions. +

+ +*** +## Promote the Updated Sandbox Manifest to Production +Once you're satisfied with testing, promote your sandbox version to production. +See [Managing App Versions & Update Notifications]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}) to learn how. diff --git a/building_applications/building_side_panel_apps.md b/building_applications/building_side_panel_apps.md index d1a53d9..1fd4550 100644 --- a/building_applications/building_side_panel_apps.md +++ b/building_applications/building_side_panel_apps.md @@ -1,384 +1,122 @@ --- permalink: /building-side-panel-apps -title: Building Procore Side Panel Applications +title: Building Side Panel Embedded Applications +sub_header: Learn how to build an embedded application that displays in the right-hand side panel of Procore’s UI. layout: default section_title: Building Applications --- ->**Note:** This article covers topics consistent with the App Manifest v4.1 format and the form-based app creation UI experience. ->For information on the App Manifest v3.x (legacy) format, see [App Manifest v3.x Legacy Format]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_legacy_v3x_manifest_format.md %}) and [Migrating an App Manifest from v3.x to v4.1]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_v3x_to_v4.1_manifest_migration.md %}). - -## Overview - -Procore has expanded the capabilities of the Procore platform to include a context-aware side panel experience in addition to the full screen embedded experience. -Developers can now build applications that display in a side panel iframe located on the right side of the Procore user interface. -Procore users click a dock icon to launch the side panel experience. -Side panel applications operate in the context of specific tools/views in Procore. -Developers use the application manifest to define the specific tools and views their side panel application supports. -Company administrators install side panel applications and create application configurations using the same installation flow as full screen embedded applications. - -This article provides details on the following steps for creating a new side panel application: - -* [Create a New Application](#create-a-new-application) -* [Add a Side Panel Component](#add-a-side-panel-component) - * [Specify Component Type and Application URL](#1-specify-component-type-and-application-url) - * [Define Parameter Interpolation](#2-define-parameter-interpolation) - * [Specify Supported Side Panel Views](#3-specify-supported-side-panel-views) - * [Save the New Component](#4-save-the-new-component) -* [Define Setup Instructions and Post-Installation Notes](#define-setup-instructions) -* [Promote Updated Sandbox Manifest to Production](#promote-updated-sandbox-manifest-to-production) -* [Save Manifest and Create Version](#save-manifest-and-create-version) -* [Test and Validate in Development Sandbox](#test-and-validate-in-development-sandbox) -* [Using postMessage to Retrieve Procore Context](#using-postmessage-to-retrieve-procore-context) - - -{% include create_application.md %} - -## Add a Side Panel Component - -The first step in configuring your new side panel application is to add a _component_. -Note that only fullscreen embedded and side panel applications require that components be defined. -If you are building a data connection application based on developer managed service accounts (DMSA), you do not need to add a component in the Configuration Builder. -See [Understanding App Types]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_app_types.md %}) for additional information on application types and components. -Follow these steps to add a new side panel component. - -### 1. Specify Component Type, Description, and Application URL - -* Navigate to the Configuration Buidler on the Manage App page, expand the Components section and click **Add Component**. -* Using the drop-down, select **Side Panel** for the component Type. -* Enter a Description for the component. This is a custom description used solely as an identifier. -* In the URL field, specify the base web address for your application. (e.g., https://example.com/1234/12). - - ![Component Type and Description]({{ site.baseurl }}/assets/guides/form-based-component-type-url-fields.png) - -### 2. Define Parameter Interpolation - -{% include url_parameter_interpolation.md %} - -* Add one or more custom URL Parameters to the component by clicking **Add Parameter**. - - ![Component Add Param]({{ site.baseurl }}/assets/guides/form-based-component-add-param.png) - -* Define the Name, Key, and Description for the custom parameter. -* Specify whether the parameter is required at time of installation. - - ![Component Add Param Field]({{ site.baseurl }}/assets/guides/form-based-component-add-param-custom.png) - -* Click **Save Parameter**. - -### 3. Specify Supported Side Panel Views - -You can specify which tools, resources, and actions your application works with and from which page(s) it will be accessible. -As some tools comprise more than one resource (e.g., commitments), this approach is both granular and flexible. -For example, you might want your app to display only on the list page, but not on the detail page. - -* Use the **Side Panel Views** drop-down list to select one or more side panel Views for your application. - - - ![Add Views]({{ site.baseurl }}/assets/guides/form-based-component-add-views.png) - -The following sections list the currently supported Side Panel Views that can be defined in the application manifest. - -#### Commitments - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/commitments/work_order_contracts/:id | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/ssov | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/change_orders | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/request_for_quotes | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/invoices | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/payments | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/change_history | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/advanced_settings | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/edit | commitments.work_order_contracts.edit | -| /:project_id/project/commitments/work_order_contracts/:id/schedule_of_values | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/billings_schedule_of_values | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/billings_schedule_of_values/edit | commitments.work_order_contracts.edit | -| /:project_id/project/commitments/work_order_contracts/:id/requisitions | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/requisitions/new | commitments.requisitions.new | -| /:project_id/project/commitments/work_order_contracts/:work_order_contract_id/requisitions/:id | commitments.requisitions.detail | -| /:project_id/project/commitments/work_order_contracts/:work_order_contract_id/admin/requisitions/:id/edit | commitments.requisitions.edit | -| /:project_id/project/commitments/work_order_contracts/:id/contract_payments | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/contract_payments/new | commitments.work_order_contracts.new | -| /:project_id/project/commitments/work_order_contracts/:id/related_items | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/related_items/edit | commitments.work_order_contracts.edit | -| /:project_id/project/commitments/work_order_contracts/:id/communications | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/communications/new | commitments.work_order_contracts.new | -| /:project_id/project/commitments/work_order_contracts/:id/change_history | commitments.work_order_contracts.detail | -| /:project_id/project/commitments/work_order_contracts/:id/advanced_settings/edit | commitments.work_order_contracts.edit | -| /:project_id/project/commitments/work_order_contracts/:id/change_orders/commitment_contract_change_orders
/new_from_change_events_bulk_action | commitments.commitment_contract_change_orders.new | -| /:project_id/project/commitments/work_order_contracts/:work_order_contract_id
/change_orders/commitment_contract_change_orders/:id | commitments.commitment_contract_change_orders.detail | -| /:project_id/project/commitments/work_order_contracts/:work_order_contract_id
/change_orders/commitment_contract_change_orders/:id/edit | commitments.commitment_contract_change_orders.edit | -| /:project_id/project/commitments/purchase_order_contracts/:id | commitments.purchase_order_contracts.detail | -| /:project_id/project/commitments/purchase_order_contracts/:id/edit | commitments.purchase_order_contracts.edit | -| /:project_id/project/commitments/purchase_order_contracts/:id/schedule_of_values | commitments.purchase_order_contracts.detail | -| /:project_id/project/commitments/purchase_order_contracts/:id/change_orders | commitments.purchase_order_contracts.detail | -| /:project_id/project/commitments/purchase_order_contracts/:id/requisitions | commitments.purchase_order_contracts.detail | -| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id/requisitions/new | commitments.requisitions.new | -| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id/requisitions/:id | commitments.requisitions.detail | -| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id/admin/requisitions/:id/edit | commitments.requisitions.edit | -| /:project_id/project/commitments/purchase_order_contracts/:id/contract_payments | commitments.purchase_order_contracts.detail | -| /:project_id/project/commitments/purchase_order_contracts/:id/contract_payments/new | commitments.purchase_order_contracts.new | -| /:project_id/project/commitments/purchase_order_contracts/:id/related_items | commitments.purchase_order_contracts.detail | -| /:project_id/project/commitments/purchase_order_contracts/:id/related_items/edit | commitments.purchase_order_contracts.edit | -| /:project_id/project/commitments/purchase_order_contracts/:id/communications | commitments.purchase_order_contracts.detail | -| /:project_id/project/commitments/purchase_order_contracts/:id/communications/new | commitments.purchase_order_contracts.new | -| /:project_id/project/commitments/purchase_order_contracts/:id/change_history | commitments.purchase_order_contracts.detail | -| /:project_id/project/commitments/purchase_order_contracts/:id/advanced_settings | commitments.purchase_order_contracts.detail | -| /:project_id/project/commitments/purchase_order_contracts/:id/advanced_settings/edit | commitments.purchase_order_contracts.edit | -| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id
/change_orders/commitment_contract_change_orders/new | commitments.commitment_contract_change_orders.new | -| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id
/change_orders/commitment_contract_change_orders/:id | commitments.commitment_contract_change_orders.detail | -| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id
/change_orders/commitment_contract_change_orders/:id/edit | commitments.commitment_contract_change_orders.edit | - -#### Commitments Beta - -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments | commitments.contracts.list | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/create | commitments.work_order_contracts.new | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
| commitments.work_order_contracts.detail | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/advanced_settings | commitments.work_order_contracts.detail | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/change_orders | commitments.work_order_contracts.detail | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/change_history | commitments.work_order_contracts.detail | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/compliance | commitments.work_order_contracts.detail | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/edit | commitments.work_order_contracts.edit | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/emails | commitments.work_order_contracts.detail | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/invoices | commitments.work_order_contracts.detail | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/payments | commitments.work_order_contracts.detail | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/rfqs | commitments.work_order_contracts.detail | -| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/ssov | commitments.work_order_contracts.detail | - -#### Contracts - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/contracts/commitments/work_order_contracts/:id | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/ssov | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/change_orders | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/rfqs | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/invoices | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/payments | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/change_history | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/advanced_settings | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/edit | commitments.work_order_contracts.edit | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/schedule_of_values | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/billings_schedule_of_values | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/billings_schedule_of_values/edit | commitments.work_order_contracts.edit | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/requisitions | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/contract_payments | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/contract_payments/new | commitments.work_order_contracts.new | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/related_items | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/related_items/edit | commitments.work_order_contracts.edit | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/communications | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/communications/new | commitments.work_order_contracts.new | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/change_history | commitments.work_order_contracts.detail | -| /:project_id/project/contracts/commitments/work_order_contracts/:id/advanced_settings/edit | commitments.work_order_contracts.edit | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id | commitments.purchase_order_contracts.detail | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/edit | commitments.purchase_order_contracts.edit | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/schedule_of_values | commitments.purchase_order_contracts.detail | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/change_orders | commitments.purchase_order_contracts.detail | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/requisitions | commitments.purchase_order_contracts.detail | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/contract_payments | commitments.purchase_order_contracts.detail | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/contract_payments/new | commitments.purchase_order_contracts.new | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/related_items | commitments.purchase_order_contracts.detail | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/related_items/edit | commitments.purchase_order_contracts.edit | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/communications | commitments.purchase_order_contracts.detail | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/communications/new | commitments.purchase_order_contracts.new | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/change_history | commitments.purchase_order_contracts.detail | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/advanced_settings | commitments.purchase_order_contracts.detail | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/advanced_settings/edit | commitments.purchase_order_contracts.edit | -| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/requisitions/:invoice_id | commitments.requisitions.detail | -| /:project_id/project/contracts/prime_contracts/:prime_contract_id/invoices | prime_contracts.invoices.list | - -#### Prime Contracts - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/prime_contracts/:id | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/edit | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/schedule_of_values | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/change_orders | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/payment_applications | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/received_payments | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/received_payments/edit | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/related_items | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/related_items/edit | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/communications | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/communications/new | prime_contracts.new | -| /:project_id/project/prime_contracts/:id/change_history | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/markups | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/advanced_settings | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/advanced_settings/edit | prime_contracts.detail | -| /:project_id/project/prime_contracts/:id/change_orders/potential_change_orders
/new_from_change_events_bulk_action | prime_contracts.change_orders.potential_change_orders.new | -| /:project_id/project/prime_contracts/:prime_contract_id/change_orders/change_order_packages/:id | prime_contracts.change_orders.detail | -| /:project_id/project/prime_contracts/:prime_contract_id/change_orders/potential_change_orders/:id | prime_contracts.change_orders.potential_change_orders.detail | -| /:project_id/project/prime_contracts/:prime_contract_id/change_orders/potential_change_orders/:id/edit | prime_contracts.change_orders.potential_change_orders.detail | -| /:project_id/project/prime_contracts/:prime_contract_id/payment_applications/new | prime_contracts.payment_applications.new | -| /:project_id/project/prime_contracts/:prime_contract_id/payment_applications/:id | prime_contracts.payment_applications.detail | -| /:project_id/project/prime_contracts/:prime_contract_id/payment_applications/:id/edit | prime_contracts.payment_applications.edit | - -#### Change Events - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/change_events/events | change_events.list | -| /:project_id/project/change_events/events/new | change_events.new | -| /:project_id/project/change_events/events/:id | change_events.detail | -| /:project_id/project/change_events/events/:id/edit | hange_events.edit | - -#### Budget - -| URL Path | View Key | -| -------- | -------- | -| /companies/:company_id/projects/:project_id/tools/budget_changes | budgeting.budget_changes.list | -| /projects/:project_id/budgeting | budgeting.list | -| /projects/:project_id/budgets/budget_details | budgeting.detail | -| /projects/:project_id/forecasting | budgeting.forecasting.detail | -| /:project_id/project/budgeting/change_history | budgeting.change_history.list | - -#### Submittal Logs - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/submittal_logs/:id | submittal_logs.detail | - -#### Project Directory - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/directory/vendors/:id/edit | project_directory.vendors.edit | -| /:project_id/project/directory/edit_person/:id | project_directory.person.edit | - -#### Observations - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/observations/items/:id/edit | observations.edit | -| /:project_id/project/observations/items | observations.list | - -#### RFIs - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/rfi/show/:id | rfi.detail | - -#### Inspections - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/checklists/lists/:id | inspections.detail | - -#### Correspondence - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/generic_tool/show/:id | correspondence.detail | - -#### Schedule - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/calendar/all | schedule.calendar.task.list | -| /:project_id/project/calendar/month | schedule.calendar.month.list | -| /:project_id/project/calendar | schedule.calendar.list | -| /:project_id/project/calendar/lookaheads | schedule.calendar.lookaheads.list | -| /:project_id/project/calendar/tasks/:task_id | schedule.calendar.task.detail | - -#### Incidents - -| URL Path | View Key | -| -------- | -------- | -| /:project_id/project/incidents | incidents.list | -| /:project_id/project/incidents/configure_tab | incidents.list | -| /:project_id/project/incidents/new | incidents.new | -| /:project_id/project/incidents/records | incidents.list | -| /:project_id/project/incidents/recycled | incidents.list | -| /:project_id/project/incidents/:id | incidents.detail | -| /:project_id/project/incidents/:id/change_history | incidents.detail | -| /:project_id/project/incidents/:id/edit | incidents.edit | -| /:project_id/project/incidents/:id/emails | incidents.detail | -| /:project_id/project/incidents/:id/emails/new | incidents.detail | -| /:project_id/project/incidents/:id/related_items | incidents.detail | -| /:project_id/project/incidents/:id/related_items/edit | incidents.detail | - -### 4. Save the New Component - -* Once you have successfully created a new side panel component and defined the Type, Description, URL, Parameter(s), and View(s), click **Save Component**. - - ![Component Save]({{ site.baseurl }}/assets/guides/form-based-component-save.png) - +## Introduction +This guide explains how to build a side panel embedded application that appears in Procore’s right-hand side panel. Side panel apps are context-aware and launch from specific tools or views within the Procore UI. + +To get started, first [create a Developer Portal account and app]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_create_new.md %}). +

+ +*** +## Add a New Side Panel Component +1. In your Developer Portal app, expand the **Embedded Components** section. +2. Click **Add Component**. +3. For **Type**, select **Side Panel**. +4. In the **URL** field, enter your app’s base web address (e.g., `https://example.com/1234/12`). +5. Select from the supported Side Panel Views. + - Use the **Side Panel Views** menu to select one or more tools and views where your app will be accessible. +6. (Optional) Add custom URL parameters. + - To learn more about URL Parameters, see [Understanding URL Parameter Interpolation]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_url_parameter_interpolation.md %}). +7. Click **Save Component**. +

+ +*** {% include setup_instructions.md %} +

-## Save Manifest and Create Version +*** +## Create Initial App Manifest Version +After configuring your component, save your App Manifest and create a version number. -After completing the steps above, you're ready to save your application configuration and set your first version number. 1. Click **Save** at the top of the page. -2. The **Create Version** window appears. Enter a version number using the following syntax: **x.x.x.** -Note: Your version number can only contain integers, and must consist of three (3) integers separated by a '.'. For example, '1.1.1'. Each new version you create must be a higher number than the previous version. +2. Click **Create Version**. +3. Enter a semantic version (e.g., `0.1.0`). + - Versions must be three integers separated by dots (`x.x.x`). +4. Click **Create**. -## Test and Validate in Development Sandbox +Your version will be saved with the status `Ready for Testing`. As you continue development, click **Save Version** to capture new changes. +

-We recommend testing and validating each version of your application in the development sandbox environment. See [Installing an Application in the Development Sandbox]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_sandbox_install.md %}) for additional information. - -## Promote Updated Sandbox Manifest to Production - -After you have successfully tested and validated your updated manifest in the development sandbox environment, you can promote it to the production environment. -See [Promoting a Sandbox Manifest to Production]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}) for additional information. - -## Using postMessage to Retrieve Procore Context - -The Procore Side Panel feature supports the [MessageEvent](https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent) interface and [Window.postMessage()](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) method to determine the Procore context in which a side panel application instance is running. -The information retrieved from a message event sent from the parent window includes the following data fields. +*** +## Use postMessage to Access Procore Context +The Procore Side Panel feature supports the [MessageEvent](https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent) interface and the [Window.postMessage()](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) method to determine the Procore context in which a side panel application instance is running. The information retrieved from a message event sent from the parent window includes the following data fields: - Company ID = event.data.context.company_id - Project ID = event.data.context.project_id - Resource ID = event.data.context.id - View = event.data.context.view -To access context data using the MessageEvent interface, add an event listener to your page and the `postMessage` method to initialize communication with the parent window. -Here is some example code that demonstrates retrieving context data from the message event object. -Note the use of conditional statements with the `postMessage` method to account for [Multiple Procore Regions]({{ site.url }}{{ site.baseurl }}{% link tutorials/tutorial_mpz.md %}). -Be sure to account for all regions where your application needs to retrieve Procore context. -Be aware that as new Procore regions become available, your `postMessage` code must be updated to support these new regions. +To access context data using the MessageEvent interface, add an event listener to your page and use the `postMessage` method to initialize communication with the parent window. The example code below demonstrates how to retrieve context data from the message event object. Note the use of conditional statements with the `postMessage` method to account for [Multiple Procore Regions]({{ site.url }}{{ site.baseurl }}{% link tutorials/tutorial_mpz.md %}). Be sure to account for all regions where your application needs to retrieve Procore context. As new Procore regions become available, update your `postMessage` code to support them. ```javascript window.addEventListener('message', (event) => { const obj = event.data; - if (obj.type === “setup”) { + if (obj.type === "setup") { const company_id = obj.context.company_id; const project_id = obj.context.project_id; const view = obj.context.view; const resource_id = obj.context.id; - }}); + } +}); -if (document.referrer === "https://app.procore.com/") { window.parent.postMessage({ type: 'initialize' }, "https://app.procore.com/"); } -if (document.referrer === "https://us02.procore.com/") { window.parent.postMessage({ type: 'initialize' }, "https://us02.procore.com/"); } -if (document.referrer === "https://uk01.procore.com/") { window.parent.postMessage({ type: 'initialize' }, "https://uk01.procore.com/"); } +if (document.referrer === "https://app.procore.com/") { + window.parent.postMessage({ type: 'initialize' }, "https://app.procore.com/"); +} +if (document.referrer === "https://us02.procore.com/") { + window.parent.postMessage({ type: 'initialize' }, "https://us02.procore.com/"); +} +if (document.referrer === "https://uk01.procore.com/") { + window.parent.postMessage({ type: 'initialize' }, "https://uk01.procore.com/"); +} ``` -In the example above we have set the value for the `targetOrigin` parameter of the `postMessage` method to `https://example.com/my-side-panel-app`. -The `targetOrigin` parameter in this method specifies the origin of the window that should receive the message. -It is important that you always provide a specific, fully-qualified URI in the `targetOrigin` parameter to ensure the best security. +In the example above, the `targetOrigin` parameter of the `postMessage` method is set to the specific origin of the parent window. The `targetOrigin` parameter specifies the origin of the window that should receive the message. Always provide a specific, fully-qualified URI in the `targetOrigin` parameter to ensure the best security. + For additional information, see the [postMessage() method documentation](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage). +

-### Additional postMessage Events +*** +## Supported Message Events +Aside from the "setup" message event fired when your app starts, additional events are fired at different life cycles of the side panel app. All these events are sent as postMessages from Procore to your app’s window. -Aside from the “setup” message event that is fired when your app is first started, there are additional events fired at different life cycles of the side panel app. -All of these events are fired as a postMessage from Procore to your app’s window. -You can listen to “message” events and filter for the data “type”. +You can listen for "message" events and filter by the data "type". ```javascript window.addEventListener('message', (event) => { const obj = event.data; - if (obj.type === “sidepanel:app:visible”) { - // do something for when app is visible + if (obj.type === "sidepanel:app:visible") { + // Do something when the app is visible. } - if (obj.type === “sidepanel:app:hidden”) { - // do something for when app is hidden, but still running + if (obj.type === "sidepanel:app:hidden") { + // Do something when the app is hidden but still running. } - if (obj.type === “sidepanel:app:destroy”) { - // do something for when app is about to be removed from the DOM + if (obj.type === "sidepanel:app:destroy") { + // Do something when the app is about to be removed from the DOM. } }); ``` +
+ +*** +## Reference: Supported Side Panel Views +Refer to the full list of supported view keys and URL patterns in the [Side Panel View Key Reference]({{ site.url }}{{ site.baseurl }}{% link building_applications/side_panel_view_keys.md %}). +

+ +*** +## Test and Validate in Development Sandbox +We recommend testing each app version in a development sandbox environment. See [Installing an Application in the Development Sandbox]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_sandbox_install.md %}) for step-by-step instructions. +

+ +*** +## Promote Updated Sandbox Manifest to Production +Once you’ve completed testing, you can promote the sandbox version to production. See [Managing App Versions & Update Notifications]({{ site.url }}{{ site.baseurl }}{% link building_applications/building_apps_promote_manifest.md %}) to learn how. +

+ +*** \ No newline at end of file diff --git a/building_applications/side_panel_view_keys.md b/building_applications/side_panel_view_keys.md new file mode 100644 index 0000000..4f17173 --- /dev/null +++ b/building_applications/side_panel_view_keys.md @@ -0,0 +1,262 @@ +--- +title: Side Panel View Key Reference +layout: default +section_title: Building Applications +--- + +## Introduction +Side Panel View Keys determine where your embedded application can appear within the Procore user interface. Each view key corresponds to a specific tool or view (e.g., Documents, Daily Log, Prime Contracts). + +Use this reference when selecting **Supported Side Panel Views** in the Developer Portal. +

+ +*** +#### Commitments + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/commitments/work_order_contracts/:id | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/ssov | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/change_orders | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/request_for_quotes | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/invoices | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/payments | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/change_history | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/advanced_settings | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/edit | commitments.work_order_contracts.edit | +| /:project_id/project/commitments/work_order_contracts/:id/schedule_of_values | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/billings_schedule_of_values | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/billings_schedule_of_values/edit | commitments.work_order_contracts.edit | +| /:project_id/project/commitments/work_order_contracts/:id/requisitions | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/requisitions/new | commitments.requisitions.new | +| /:project_id/project/commitments/work_order_contracts/:work_order_contract_id/requisitions/:id | commitments.requisitions.detail | +| /:project_id/project/commitments/work_order_contracts/:work_order_contract_id/admin/requisitions/:id/edit | commitments.requisitions.edit | +| /:project_id/project/commitments/work_order_contracts/:id/contract_payments | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/contract_payments/new | commitments.work_order_contracts.new | +| /:project_id/project/commitments/work_order_contracts/:id/related_items | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/related_items/edit | commitments.work_order_contracts.edit | +| /:project_id/project/commitments/work_order_contracts/:id/communications | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/communications/new | commitments.work_order_contracts.new | +| /:project_id/project/commitments/work_order_contracts/:id/change_history | commitments.work_order_contracts.detail | +| /:project_id/project/commitments/work_order_contracts/:id/advanced_settings/edit | commitments.work_order_contracts.edit | +| /:project_id/project/commitments/work_order_contracts/:id/change_orders/commitment_contract_change_orders
/new_from_change_events_bulk_action | commitments.commitment_contract_change_orders.new | +| /:project_id/project/commitments/work_order_contracts/:work_order_contract_id
/change_orders/commitment_contract_change_orders/:id | commitments.commitment_contract_change_orders.detail | +| /:project_id/project/commitments/work_order_contracts/:work_order_contract_id
/change_orders/commitment_contract_change_orders/:id/edit | commitments.commitment_contract_change_orders.edit | +| /:project_id/project/commitments/purchase_order_contracts/:id | commitments.purchase_order_contracts.detail | +| /:project_id/project/commitments/purchase_order_contracts/:id/edit | commitments.purchase_order_contracts.edit | +| /:project_id/project/commitments/purchase_order_contracts/:id/schedule_of_values | commitments.purchase_order_contracts.detail | +| /:project_id/project/commitments/purchase_order_contracts/:id/change_orders | commitments.purchase_order_contracts.detail | +| /:project_id/project/commitments/purchase_order_contracts/:id/requisitions | commitments.purchase_order_contracts.detail | +| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id/requisitions/new | commitments.requisitions.new | +| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id/requisitions/:id | commitments.requisitions.detail | +| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id/admin/requisitions/:id/edit | commitments.requisitions.edit | +| /:project_id/project/commitments/purchase_order_contracts/:id/contract_payments | commitments.purchase_order_contracts.detail | +| /:project_id/project/commitments/purchase_order_contracts/:id/contract_payments/new | commitments.purchase_order_contracts.new | +| /:project_id/project/commitments/purchase_order_contracts/:id/related_items | commitments.purchase_order_contracts.detail | +| /:project_id/project/commitments/purchase_order_contracts/:id/related_items/edit | commitments.purchase_order_contracts.edit | +| /:project_id/project/commitments/purchase_order_contracts/:id/communications | commitments.purchase_order_contracts.detail | +| /:project_id/project/commitments/purchase_order_contracts/:id/communications/new | commitments.purchase_order_contracts.new | +| /:project_id/project/commitments/purchase_order_contracts/:id/change_history | commitments.purchase_order_contracts.detail | +| /:project_id/project/commitments/purchase_order_contracts/:id/advanced_settings | commitments.purchase_order_contracts.detail | +| /:project_id/project/commitments/purchase_order_contracts/:id/advanced_settings/edit | commitments.purchase_order_contracts.edit | +| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id
/change_orders/commitment_contract_change_orders/new | commitments.commitment_contract_change_orders.new | +| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id
/change_orders/commitment_contract_change_orders/:id | commitments.commitment_contract_change_orders.detail | +| /:project_id/project/commitments/purchase_order_contracts/:purchase_order_contract_id
/change_orders/commitment_contract_change_orders/:id/edit | commitments.commitment_contract_change_orders.edit | + + +#### Commitments Beta + + +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments | commitments.contracts.list | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/create | commitments.work_order_contracts.new | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
| commitments.work_order_contracts.detail | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/advanced_settings | commitments.work_order_contracts.detail | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/change_orders | commitments.work_order_contracts.detail | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/change_history | commitments.work_order_contracts.detail | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/compliance | commitments.work_order_contracts.detail | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/edit | commitments.work_order_contracts.edit | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/emails | commitments.work_order_contracts.detail | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/invoices | commitments.work_order_contracts.detail | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/payments | commitments.work_order_contracts.detail | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/rfqs | commitments.work_order_contracts.detail | +| /webclients/host/companies/:company_id/projects/:project_id/tools/contracts/commitments/work_order_contracts/:id
/ssov | commitments.work_order_contracts.detail | + + +#### Contracts + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/contracts/commitments/work_order_contracts/:id | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/ssov | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/change_orders | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/rfqs | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/invoices | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/payments | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/change_history | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/advanced_settings | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/edit | commitments.work_order_contracts.edit | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/schedule_of_values | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/billings_schedule_of_values | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/billings_schedule_of_values/edit | commitments.work_order_contracts.edit | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/requisitions | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/contract_payments | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/contract_payments/new | commitments.work_order_contracts.new | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/related_items | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/related_items/edit | commitments.work_order_contracts.edit | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/communications | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/communications/new | commitments.work_order_contracts.new | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/change_history | commitments.work_order_contracts.detail | +| /:project_id/project/contracts/commitments/work_order_contracts/:id/advanced_settings/edit | commitments.work_order_contracts.edit | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id | commitments.purchase_order_contracts.detail | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/edit | commitments.purchase_order_contracts.edit | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/schedule_of_values | commitments.purchase_order_contracts.detail | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/change_orders | commitments.purchase_order_contracts.detail | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/requisitions | commitments.purchase_order_contracts.detail | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/contract_payments | commitments.purchase_order_contracts.detail | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/contract_payments/new | commitments.purchase_order_contracts.new | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/related_items | commitments.purchase_order_contracts.detail | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/related_items/edit | commitments.purchase_order_contracts.edit | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/communications | commitments.purchase_order_contracts.detail | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/communications/new | commitments.purchase_order_contracts.new | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/change_history | commitments.purchase_order_contracts.detail | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/advanced_settings | commitments.purchase_order_contracts.detail | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/advanced_settings/edit | commitments.purchase_order_contracts.edit | +| /:project_id/project/contracts/commitments/purchase_order_contracts/:id/requisitions/:invoice_id | commitments.requisitions.detail | +| /:project_id/project/contracts/prime_contracts/:prime_contract_id/invoices | prime_contracts.invoices.list | + + +#### Prime Contracts + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/prime_contracts/:id | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/edit | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/schedule_of_values | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/change_orders | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/payment_applications | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/received_payments | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/received_payments/edit | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/related_items | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/related_items/edit | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/communications | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/communications/new | prime_contracts.new | +| /:project_id/project/prime_contracts/:id/change_history | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/markups | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/advanced_settings | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/advanced_settings/edit | prime_contracts.detail | +| /:project_id/project/prime_contracts/:id/change_orders/potential_change_orders
/new_from_change_events_bulk_action | prime_contracts.change_orders.potential_change_orders.new | +| /:project_id/project/prime_contracts/:prime_contract_id/change_orders/change_order_packages/:id | prime_contracts.change_orders.detail | +| /:project_id/project/prime_contracts/:prime_contract_id/change_orders/potential_change_orders/:id | prime_contracts.change_orders.potential_change_orders.detail | +| /:project_id/project/prime_contracts/:prime_contract_id/change_orders/potential_change_orders/:id/edit | prime_contracts.change_orders.potential_change_orders.detail | +| /:project_id/project/prime_contracts/:prime_contract_id/payment_applications/new | prime_contracts.payment_applications.new | +| /:project_id/project/prime_contracts/:prime_contract_id/payment_applications/:id | prime_contracts.payment_applications.detail | +| /:project_id/project/prime_contracts/:prime_contract_id/payment_applications/:id/edit | prime_contracts.payment_applications.edit | + + +#### Change Events + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/change_events/events | change_events.list | +| /:project_id/project/change_events/events/new | change_events.new | +| /:project_id/project/change_events/events/:id | change_events.detail | +| /:project_id/project/change_events/events/:id/edit | hange_events.edit | + + +#### Budget + + +| URL Path | View Key | +| -------- | -------- | +| /companies/:company_id/projects/:project_id/tools/budget_changes | budgeting.budget_changes.list | +| /projects/:project_id/budgeting | budgeting.list | +| /projects/:project_id/budgets/budget_details | budgeting.detail | +| /projects/:project_id/forecasting | budgeting.forecasting.detail | +| /:project_id/project/budgeting/change_history | budgeting.change_history.list | + + +#### Submittal Logs + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/submittal_logs/:id | submittal_logs.detail | + + +#### Project Directory + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/directory/vendors/:id/edit | project_directory.vendors.edit | +| /:project_id/project/directory/edit_person/:id | project_directory.person.edit | + + +#### Observations + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/observations/items/:id/edit | observations.edit | +| /:project_id/project/observations/items | observations.list | + + +#### RFIs + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/rfi/show/:id | rfi.detail | + + +#### Inspections + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/checklists/lists/:id | inspections.detail | + + +#### Correspondence + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/generic_tool/show/:id | correspondence.detail | + + +#### Schedule + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/calendar/all | schedule.calendar.task.list | +| /:project_id/project/calendar/month | schedule.calendar.month.list | +| /:project_id/project/calendar | schedule.calendar.list | +| /:project_id/project/calendar/lookaheads | schedule.calendar.lookaheads.list | +| /:project_id/project/calendar/tasks/:task_id | schedule.calendar.task.detail | + + +#### Incidents + + +| URL Path | View Key | +| -------- | -------- | +| /:project_id/project/incidents | incidents.list | +| /:project_id/project/incidents/configure_tab | incidents.list | +| /:project_id/project/incidents/new | incidents.new | +| /:project_id/project/incidents/records | incidents.list | +| /:project_id/project/incidents/recycled | incidents.list | +| /:project_id/project/incidents/:id | incidents.detail | +| /:project_id/project/incidents/:id/change_history | incidents.detail | +| /:project_id/project/incidents/:id/edit | incidents.edit | +| /:project_id/project/incidents/:id/emails | incidents.detail | +| /:project_id/project/incidents/:id/emails/new | incidents.detail | +| /:project_id/project/incidents/:id/related_items | incidents.detail | +| /:project_id/project/incidents/:id/related_items/edit | incidents.detail | + +*** \ No newline at end of file