ref(app-platform): Add integration features to SentryAppDetailsModal - #13393

Merged
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal
Jul 5, 2019
Merged

ref(app-platform): Add integration features to SentryAppDetailsModal#13393
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal

Conversation

@MeredithAnya

Copy link
Copy Markdown
Member

Depends on #13377

Screen Shot 2019-05-24 at 10 35 22 AM

@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from a50ae9f to 144968bCompareJune 5, 2019 18:09
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch 4 times, most recently from d732b1a to 10db914CompareJune 21, 2019 18:32
@MeredithAnya
MeredithAnya requested a review from mnobleJune 21, 2019 20:05

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should add some tests ensuring the installation button is disabled, based on the IntegrationFeature.

const featureListHooks = HookStore.get('integrations:feature-gates');
featureListHooks.push(() => defaultFeatureGateComponents);

const {FeatureList, IntegrationFeatures} = featureListHooks[0]();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions (do you know why?). Then we're adding defaultFeatureGateComponents to it. Then we're calling the first item in that list? Is the push in case it returns an empty list?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the defaultFeatureGateComponent list for if you are just running sentry to make this compatible for on-prem people.

Is the push in case it returns an empty list?

This is so we use the pretty markdown and plan specific information for sentry.io

I forget exactly know how the HookStore works so maybe @evanpurkhiser can shed light on the 'returns list of functions' question.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MeredithAnya I agree with @mnoble that the code makes this a bit confusing to understand what's going on, though I see this is used other places in the code base. I'm wondering if there is a clearer way to get the same behavior. Here is my suggestion:

const featureHook = HookStore.get('integrations:feature-gates')[0] || defaultFeatureGateComponents;
const {FeatureList, IntegrationFeatures} = featureHook();

This also avoids mutating the array that is stored in the HookStore with key integrations:feature-gates. The mutation probably does not have any consequences in this case but in general, it's better to avoid mutation unless that is the explicit goal.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was my doing.

Yes we push it onto the end in the case that it's empty.

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||defaultFeatureGateComponents;

This would need to be written as

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||(()=>defaultFeatureGateComponents);

Since we call the hookstore function to get our components back.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions

This is historically just the convention that we have typically used for hookstore. I think it's not great considering there are actually a lot of times where we do not want a list. In fact, if you look around the code base, I would say a majority of the times we just pop off the first function and call it.

@scefaliscefaliJul 3, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@evanpurkhiser Does it make sense to make a getFirst method on the HookStore? Probably outside the scope of this PR but if what you are saying is true then getting the full array is just a hassle.

EDIT:
Maybe even have a getFirstAndCall method so we can take care of calling the method as well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would probably make more sense to re-evaluate how we're using hookstore. Not sure how much you've seen it yet, but it's basically a bridge between sentry and getsentry, a way to add frontend features specific to the SASS product

@MeredithAnya
MeredithAnya requested a review from scefaliJuly 2, 2019 16:56
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from 10db914 to eacf461CompareJuly 2, 2019 17:17
Comment threadsrc/sentry/static/sentry/app/components/modals/sentryAppDetailsModal.jsx Outdated
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from eacf461 to 260770dCompareJuly 2, 2019 23:10

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd update that one section to what @scefali suggested, get this on staging again, and then I think we're good.

@MeredithAnya
MeredithAnya merged commit e873279 into masterJul 5, 2019
@MeredithAnya
MeredithAnya deleted the app-platform/integration-features-modal branch July 5, 2019 17:56
jan-auer added a commit that referenced this pull request Jul 9, 2019
* master:
chore: Fix typo errywhere -> everywhere (#13934)
ref: (Django 1.9) Bump djangorestframework to 3.0.5 as an intermediate step to get to 3.3.x
feat(issueless events): Test eventstream work without groups (#13888)
ref: Improve repr of User (#13896)
feat(loader): Make the default for new js projects v5 of js sdk (#13327)
build: Remove browser-reload flag (#13918)
ref(ui): Consolidate server frontend hydration logic (#13868)
ref: Refactor user reports to not use Postgres Event (#13904)
Test/integration acceptance tests (#13895)
feat: Remove ts-jest (#13846)
obs(sentry_apps): Add a small metrics increment on processing resource changes. (#13897)
enable testing for all orgs (#13903)
ref: Update Python SDK to 0.10.0 (#13911)
fix: Do not suggest Sentry.Extensions.Logging when ASP.NET Core is used (#13891)
Update license year to 2019
ci(travis): Move docker-sentry builds to Dockes Hub autobuild (#13901)
ref(app-platform): Add integration features to SentryAppDetailsModal (#13393)
chore(ui) Rename OrganizationStream to IssueList (#13892)
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MeredithAnya@mnoble@evanpurkhiser@scefali
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

ref(app-platform): Add integration features to SentryAppDetailsModal - #13393

Merged
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal
Jul 5, 2019
Merged

ref(app-platform): Add integration features to SentryAppDetailsModal#13393
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal

Conversation

@MeredithAnya

Copy link
Copy Markdown
Member

Depends on #13377

Screen Shot 2019-05-24 at 10 35 22 AM

@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from a50ae9f to 144968bCompareJune 5, 2019 18:09
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch 4 times, most recently from d732b1a to 10db914CompareJune 21, 2019 18:32
@MeredithAnya
MeredithAnya requested a review from mnobleJune 21, 2019 20:05

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should add some tests ensuring the installation button is disabled, based on the IntegrationFeature.

const featureListHooks = HookStore.get('integrations:feature-gates');
featureListHooks.push(() => defaultFeatureGateComponents);

const {FeatureList, IntegrationFeatures} = featureListHooks[0]();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions (do you know why?). Then we're adding defaultFeatureGateComponents to it. Then we're calling the first item in that list? Is the push in case it returns an empty list?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the defaultFeatureGateComponent list for if you are just running sentry to make this compatible for on-prem people.

Is the push in case it returns an empty list?

This is so we use the pretty markdown and plan specific information for sentry.io

I forget exactly know how the HookStore works so maybe @evanpurkhiser can shed light on the 'returns list of functions' question.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MeredithAnya I agree with @mnoble that the code makes this a bit confusing to understand what's going on, though I see this is used other places in the code base. I'm wondering if there is a clearer way to get the same behavior. Here is my suggestion:

const featureHook = HookStore.get('integrations:feature-gates')[0] || defaultFeatureGateComponents;
const {FeatureList, IntegrationFeatures} = featureHook();

This also avoids mutating the array that is stored in the HookStore with key integrations:feature-gates. The mutation probably does not have any consequences in this case but in general, it's better to avoid mutation unless that is the explicit goal.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was my doing.

Yes we push it onto the end in the case that it's empty.

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||defaultFeatureGateComponents;

This would need to be written as

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||(()=>defaultFeatureGateComponents);

Since we call the hookstore function to get our components back.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions

This is historically just the convention that we have typically used for hookstore. I think it's not great considering there are actually a lot of times where we do not want a list. In fact, if you look around the code base, I would say a majority of the times we just pop off the first function and call it.

@scefaliscefaliJul 3, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@evanpurkhiser Does it make sense to make a getFirst method on the HookStore? Probably outside the scope of this PR but if what you are saying is true then getting the full array is just a hassle.

EDIT:
Maybe even have a getFirstAndCall method so we can take care of calling the method as well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would probably make more sense to re-evaluate how we're using hookstore. Not sure how much you've seen it yet, but it's basically a bridge between sentry and getsentry, a way to add frontend features specific to the SASS product

@MeredithAnya
MeredithAnya requested a review from scefaliJuly 2, 2019 16:56
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from 10db914 to eacf461CompareJuly 2, 2019 17:17
Comment threadsrc/sentry/static/sentry/app/components/modals/sentryAppDetailsModal.jsx Outdated
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from eacf461 to 260770dCompareJuly 2, 2019 23:10

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd update that one section to what @scefali suggested, get this on staging again, and then I think we're good.

@MeredithAnya
MeredithAnya merged commit e873279 into masterJul 5, 2019
@MeredithAnya
MeredithAnya deleted the app-platform/integration-features-modal branch July 5, 2019 17:56
jan-auer added a commit that referenced this pull request Jul 9, 2019
* master:
chore: Fix typo errywhere -> everywhere (#13934)
ref: (Django 1.9) Bump djangorestframework to 3.0.5 as an intermediate step to get to 3.3.x
feat(issueless events): Test eventstream work without groups (#13888)
ref: Improve repr of User (#13896)
feat(loader): Make the default for new js projects v5 of js sdk (#13327)
build: Remove browser-reload flag (#13918)
ref(ui): Consolidate server frontend hydration logic (#13868)
ref: Refactor user reports to not use Postgres Event (#13904)
Test/integration acceptance tests (#13895)
feat: Remove ts-jest (#13846)
obs(sentry_apps): Add a small metrics increment on processing resource changes. (#13897)
enable testing for all orgs (#13903)
ref: Update Python SDK to 0.10.0 (#13911)
fix: Do not suggest Sentry.Extensions.Logging when ASP.NET Core is used (#13891)
Update license year to 2019
ci(travis): Move docker-sentry builds to Dockes Hub autobuild (#13901)
ref(app-platform): Add integration features to SentryAppDetailsModal (#13393)
chore(ui) Rename OrganizationStream to IssueList (#13892)
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MeredithAnya@mnoble@evanpurkhiser@scefali
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref(app-platform): Add integration features to SentryAppDetailsModal - #13393

Merged
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal
Jul 5, 2019
Merged

ref(app-platform): Add integration features to SentryAppDetailsModal#13393
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal

Conversation

@MeredithAnya

Copy link
Copy Markdown
Member

Depends on #13377

Screen Shot 2019-05-24 at 10 35 22 AM

@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from a50ae9f to 144968bCompareJune 5, 2019 18:09
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch 4 times, most recently from d732b1a to 10db914CompareJune 21, 2019 18:32
@MeredithAnya
MeredithAnya requested a review from mnobleJune 21, 2019 20:05

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should add some tests ensuring the installation button is disabled, based on the IntegrationFeature.

const featureListHooks = HookStore.get('integrations:feature-gates');
featureListHooks.push(() => defaultFeatureGateComponents);

const {FeatureList, IntegrationFeatures} = featureListHooks[0]();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions (do you know why?). Then we're adding defaultFeatureGateComponents to it. Then we're calling the first item in that list? Is the push in case it returns an empty list?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the defaultFeatureGateComponent list for if you are just running sentry to make this compatible for on-prem people.

Is the push in case it returns an empty list?

This is so we use the pretty markdown and plan specific information for sentry.io

I forget exactly know how the HookStore works so maybe @evanpurkhiser can shed light on the 'returns list of functions' question.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MeredithAnya I agree with @mnoble that the code makes this a bit confusing to understand what's going on, though I see this is used other places in the code base. I'm wondering if there is a clearer way to get the same behavior. Here is my suggestion:

const featureHook = HookStore.get('integrations:feature-gates')[0] || defaultFeatureGateComponents;
const {FeatureList, IntegrationFeatures} = featureHook();

This also avoids mutating the array that is stored in the HookStore with key integrations:feature-gates. The mutation probably does not have any consequences in this case but in general, it's better to avoid mutation unless that is the explicit goal.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was my doing.

Yes we push it onto the end in the case that it's empty.

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||defaultFeatureGateComponents;

This would need to be written as

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||(()=>defaultFeatureGateComponents);

Since we call the hookstore function to get our components back.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions

This is historically just the convention that we have typically used for hookstore. I think it's not great considering there are actually a lot of times where we do not want a list. In fact, if you look around the code base, I would say a majority of the times we just pop off the first function and call it.

@scefaliscefaliJul 3, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@evanpurkhiser Does it make sense to make a getFirst method on the HookStore? Probably outside the scope of this PR but if what you are saying is true then getting the full array is just a hassle.

EDIT:
Maybe even have a getFirstAndCall method so we can take care of calling the method as well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would probably make more sense to re-evaluate how we're using hookstore. Not sure how much you've seen it yet, but it's basically a bridge between sentry and getsentry, a way to add frontend features specific to the SASS product

@MeredithAnya
MeredithAnya requested a review from scefaliJuly 2, 2019 16:56
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from 10db914 to eacf461CompareJuly 2, 2019 17:17
Comment threadsrc/sentry/static/sentry/app/components/modals/sentryAppDetailsModal.jsx Outdated
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from eacf461 to 260770dCompareJuly 2, 2019 23:10

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd update that one section to what @scefali suggested, get this on staging again, and then I think we're good.

@MeredithAnya
MeredithAnya merged commit e873279 into masterJul 5, 2019
@MeredithAnya
MeredithAnya deleted the app-platform/integration-features-modal branch July 5, 2019 17:56
jan-auer added a commit that referenced this pull request Jul 9, 2019
* master:
chore: Fix typo errywhere -> everywhere (#13934)
ref: (Django 1.9) Bump djangorestframework to 3.0.5 as an intermediate step to get to 3.3.x
feat(issueless events): Test eventstream work without groups (#13888)
ref: Improve repr of User (#13896)
feat(loader): Make the default for new js projects v5 of js sdk (#13327)
build: Remove browser-reload flag (#13918)
ref(ui): Consolidate server frontend hydration logic (#13868)
ref: Refactor user reports to not use Postgres Event (#13904)
Test/integration acceptance tests (#13895)
feat: Remove ts-jest (#13846)
obs(sentry_apps): Add a small metrics increment on processing resource changes. (#13897)
enable testing for all orgs (#13903)
ref: Update Python SDK to 0.10.0 (#13911)
fix: Do not suggest Sentry.Extensions.Logging when ASP.NET Core is used (#13891)
Update license year to 2019
ci(travis): Move docker-sentry builds to Dockes Hub autobuild (#13901)
ref(app-platform): Add integration features to SentryAppDetailsModal (#13393)
chore(ui) Rename OrganizationStream to IssueList (#13892)
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MeredithAnya@mnoble@evanpurkhiser@scefali
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref(app-platform): Add integration features to SentryAppDetailsModal - #13393

Merged
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal
Jul 5, 2019
Merged

ref(app-platform): Add integration features to SentryAppDetailsModal#13393
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal

Conversation

@MeredithAnya

Copy link
Copy Markdown
Member

Depends on #13377

Screen Shot 2019-05-24 at 10 35 22 AM

@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from a50ae9f to 144968bCompareJune 5, 2019 18:09
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch 4 times, most recently from d732b1a to 10db914CompareJune 21, 2019 18:32
@MeredithAnya
MeredithAnya requested a review from mnobleJune 21, 2019 20:05

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should add some tests ensuring the installation button is disabled, based on the IntegrationFeature.

const featureListHooks = HookStore.get('integrations:feature-gates');
featureListHooks.push(() => defaultFeatureGateComponents);

const {FeatureList, IntegrationFeatures} = featureListHooks[0]();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions (do you know why?). Then we're adding defaultFeatureGateComponents to it. Then we're calling the first item in that list? Is the push in case it returns an empty list?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the defaultFeatureGateComponent list for if you are just running sentry to make this compatible for on-prem people.

Is the push in case it returns an empty list?

This is so we use the pretty markdown and plan specific information for sentry.io

I forget exactly know how the HookStore works so maybe @evanpurkhiser can shed light on the 'returns list of functions' question.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MeredithAnya I agree with @mnoble that the code makes this a bit confusing to understand what's going on, though I see this is used other places in the code base. I'm wondering if there is a clearer way to get the same behavior. Here is my suggestion:

const featureHook = HookStore.get('integrations:feature-gates')[0] || defaultFeatureGateComponents;
const {FeatureList, IntegrationFeatures} = featureHook();

This also avoids mutating the array that is stored in the HookStore with key integrations:feature-gates. The mutation probably does not have any consequences in this case but in general, it's better to avoid mutation unless that is the explicit goal.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was my doing.

Yes we push it onto the end in the case that it's empty.

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||defaultFeatureGateComponents;

This would need to be written as

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||(()=>defaultFeatureGateComponents);

Since we call the hookstore function to get our components back.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions

This is historically just the convention that we have typically used for hookstore. I think it's not great considering there are actually a lot of times where we do not want a list. In fact, if you look around the code base, I would say a majority of the times we just pop off the first function and call it.

@scefaliscefaliJul 3, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@evanpurkhiser Does it make sense to make a getFirst method on the HookStore? Probably outside the scope of this PR but if what you are saying is true then getting the full array is just a hassle.

EDIT:
Maybe even have a getFirstAndCall method so we can take care of calling the method as well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would probably make more sense to re-evaluate how we're using hookstore. Not sure how much you've seen it yet, but it's basically a bridge between sentry and getsentry, a way to add frontend features specific to the SASS product

@MeredithAnya
MeredithAnya requested a review from scefaliJuly 2, 2019 16:56
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from 10db914 to eacf461CompareJuly 2, 2019 17:17
Comment threadsrc/sentry/static/sentry/app/components/modals/sentryAppDetailsModal.jsx Outdated
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from eacf461 to 260770dCompareJuly 2, 2019 23:10

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd update that one section to what @scefali suggested, get this on staging again, and then I think we're good.

@MeredithAnya
MeredithAnya merged commit e873279 into masterJul 5, 2019
@MeredithAnya
MeredithAnya deleted the app-platform/integration-features-modal branch July 5, 2019 17:56
jan-auer added a commit that referenced this pull request Jul 9, 2019
* master:
chore: Fix typo errywhere -> everywhere (#13934)
ref: (Django 1.9) Bump djangorestframework to 3.0.5 as an intermediate step to get to 3.3.x
feat(issueless events): Test eventstream work without groups (#13888)
ref: Improve repr of User (#13896)
feat(loader): Make the default for new js projects v5 of js sdk (#13327)
build: Remove browser-reload flag (#13918)
ref(ui): Consolidate server frontend hydration logic (#13868)
ref: Refactor user reports to not use Postgres Event (#13904)
Test/integration acceptance tests (#13895)
feat: Remove ts-jest (#13846)
obs(sentry_apps): Add a small metrics increment on processing resource changes. (#13897)
enable testing for all orgs (#13903)
ref: Update Python SDK to 0.10.0 (#13911)
fix: Do not suggest Sentry.Extensions.Logging when ASP.NET Core is used (#13891)
Update license year to 2019
ci(travis): Move docker-sentry builds to Dockes Hub autobuild (#13901)
ref(app-platform): Add integration features to SentryAppDetailsModal (#13393)
chore(ui) Rename OrganizationStream to IssueList (#13892)
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MeredithAnya@mnoble@evanpurkhiser@scefali
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

ref(app-platform): Add integration features to SentryAppDetailsModal - #13393

Merged
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal
Jul 5, 2019
Merged

ref(app-platform): Add integration features to SentryAppDetailsModal#13393
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal

Conversation

@MeredithAnya

Copy link
Copy Markdown
Member

Depends on #13377

Screen Shot 2019-05-24 at 10 35 22 AM

@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from a50ae9f to 144968bCompareJune 5, 2019 18:09
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch 4 times, most recently from d732b1a to 10db914CompareJune 21, 2019 18:32
@MeredithAnya
MeredithAnya requested a review from mnobleJune 21, 2019 20:05

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should add some tests ensuring the installation button is disabled, based on the IntegrationFeature.

const featureListHooks = HookStore.get('integrations:feature-gates');
featureListHooks.push(() => defaultFeatureGateComponents);

const {FeatureList, IntegrationFeatures} = featureListHooks[0]();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions (do you know why?). Then we're adding defaultFeatureGateComponents to it. Then we're calling the first item in that list? Is the push in case it returns an empty list?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the defaultFeatureGateComponent list for if you are just running sentry to make this compatible for on-prem people.

Is the push in case it returns an empty list?

This is so we use the pretty markdown and plan specific information for sentry.io

I forget exactly know how the HookStore works so maybe @evanpurkhiser can shed light on the 'returns list of functions' question.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MeredithAnya I agree with @mnoble that the code makes this a bit confusing to understand what's going on, though I see this is used other places in the code base. I'm wondering if there is a clearer way to get the same behavior. Here is my suggestion:

const featureHook = HookStore.get('integrations:feature-gates')[0] || defaultFeatureGateComponents;
const {FeatureList, IntegrationFeatures} = featureHook();

This also avoids mutating the array that is stored in the HookStore with key integrations:feature-gates. The mutation probably does not have any consequences in this case but in general, it's better to avoid mutation unless that is the explicit goal.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was my doing.

Yes we push it onto the end in the case that it's empty.

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||defaultFeatureGateComponents;

This would need to be written as

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||(()=>defaultFeatureGateComponents);

Since we call the hookstore function to get our components back.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions

This is historically just the convention that we have typically used for hookstore. I think it's not great considering there are actually a lot of times where we do not want a list. In fact, if you look around the code base, I would say a majority of the times we just pop off the first function and call it.

@scefaliscefaliJul 3, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@evanpurkhiser Does it make sense to make a getFirst method on the HookStore? Probably outside the scope of this PR but if what you are saying is true then getting the full array is just a hassle.

EDIT:
Maybe even have a getFirstAndCall method so we can take care of calling the method as well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would probably make more sense to re-evaluate how we're using hookstore. Not sure how much you've seen it yet, but it's basically a bridge between sentry and getsentry, a way to add frontend features specific to the SASS product

@MeredithAnya
MeredithAnya requested a review from scefaliJuly 2, 2019 16:56
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from 10db914 to eacf461CompareJuly 2, 2019 17:17
Comment threadsrc/sentry/static/sentry/app/components/modals/sentryAppDetailsModal.jsx Outdated
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from eacf461 to 260770dCompareJuly 2, 2019 23:10

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd update that one section to what @scefali suggested, get this on staging again, and then I think we're good.

@MeredithAnya
MeredithAnya merged commit e873279 into masterJul 5, 2019
@MeredithAnya
MeredithAnya deleted the app-platform/integration-features-modal branch July 5, 2019 17:56
jan-auer added a commit that referenced this pull request Jul 9, 2019
* master:
chore: Fix typo errywhere -> everywhere (#13934)
ref: (Django 1.9) Bump djangorestframework to 3.0.5 as an intermediate step to get to 3.3.x
feat(issueless events): Test eventstream work without groups (#13888)
ref: Improve repr of User (#13896)
feat(loader): Make the default for new js projects v5 of js sdk (#13327)
build: Remove browser-reload flag (#13918)
ref(ui): Consolidate server frontend hydration logic (#13868)
ref: Refactor user reports to not use Postgres Event (#13904)
Test/integration acceptance tests (#13895)
feat: Remove ts-jest (#13846)
obs(sentry_apps): Add a small metrics increment on processing resource changes. (#13897)
enable testing for all orgs (#13903)
ref: Update Python SDK to 0.10.0 (#13911)
fix: Do not suggest Sentry.Extensions.Logging when ASP.NET Core is used (#13891)
Update license year to 2019
ci(travis): Move docker-sentry builds to Dockes Hub autobuild (#13901)
ref(app-platform): Add integration features to SentryAppDetailsModal (#13393)
chore(ui) Rename OrganizationStream to IssueList (#13892)
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MeredithAnya@mnoble@evanpurkhiser@scefali
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref(app-platform): Add integration features to SentryAppDetailsModal - #13393

Merged
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal
Jul 5, 2019
Merged

ref(app-platform): Add integration features to SentryAppDetailsModal#13393
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal

Conversation

@MeredithAnya

Copy link
Copy Markdown
Member

Depends on #13377

Screen Shot 2019-05-24 at 10 35 22 AM

@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from a50ae9f to 144968bCompareJune 5, 2019 18:09
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch 4 times, most recently from d732b1a to 10db914CompareJune 21, 2019 18:32
@MeredithAnya
MeredithAnya requested a review from mnobleJune 21, 2019 20:05

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should add some tests ensuring the installation button is disabled, based on the IntegrationFeature.

const featureListHooks = HookStore.get('integrations:feature-gates');
featureListHooks.push(() => defaultFeatureGateComponents);

const {FeatureList, IntegrationFeatures} = featureListHooks[0]();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions (do you know why?). Then we're adding defaultFeatureGateComponents to it. Then we're calling the first item in that list? Is the push in case it returns an empty list?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the defaultFeatureGateComponent list for if you are just running sentry to make this compatible for on-prem people.

Is the push in case it returns an empty list?

This is so we use the pretty markdown and plan specific information for sentry.io

I forget exactly know how the HookStore works so maybe @evanpurkhiser can shed light on the 'returns list of functions' question.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MeredithAnya I agree with @mnoble that the code makes this a bit confusing to understand what's going on, though I see this is used other places in the code base. I'm wondering if there is a clearer way to get the same behavior. Here is my suggestion:

const featureHook = HookStore.get('integrations:feature-gates')[0] || defaultFeatureGateComponents;
const {FeatureList, IntegrationFeatures} = featureHook();

This also avoids mutating the array that is stored in the HookStore with key integrations:feature-gates. The mutation probably does not have any consequences in this case but in general, it's better to avoid mutation unless that is the explicit goal.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was my doing.

Yes we push it onto the end in the case that it's empty.

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||defaultFeatureGateComponents;

This would need to be written as

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||(()=>defaultFeatureGateComponents);

Since we call the hookstore function to get our components back.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions

This is historically just the convention that we have typically used for hookstore. I think it's not great considering there are actually a lot of times where we do not want a list. In fact, if you look around the code base, I would say a majority of the times we just pop off the first function and call it.

@scefaliscefaliJul 3, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@evanpurkhiser Does it make sense to make a getFirst method on the HookStore? Probably outside the scope of this PR but if what you are saying is true then getting the full array is just a hassle.

EDIT:
Maybe even have a getFirstAndCall method so we can take care of calling the method as well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would probably make more sense to re-evaluate how we're using hookstore. Not sure how much you've seen it yet, but it's basically a bridge between sentry and getsentry, a way to add frontend features specific to the SASS product

@MeredithAnya
MeredithAnya requested a review from scefaliJuly 2, 2019 16:56
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from 10db914 to eacf461CompareJuly 2, 2019 17:17
Comment threadsrc/sentry/static/sentry/app/components/modals/sentryAppDetailsModal.jsx Outdated
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from eacf461 to 260770dCompareJuly 2, 2019 23:10

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd update that one section to what @scefali suggested, get this on staging again, and then I think we're good.

@MeredithAnya
MeredithAnya merged commit e873279 into masterJul 5, 2019
@MeredithAnya
MeredithAnya deleted the app-platform/integration-features-modal branch July 5, 2019 17:56
jan-auer added a commit that referenced this pull request Jul 9, 2019
* master:
chore: Fix typo errywhere -> everywhere (#13934)
ref: (Django 1.9) Bump djangorestframework to 3.0.5 as an intermediate step to get to 3.3.x
feat(issueless events): Test eventstream work without groups (#13888)
ref: Improve repr of User (#13896)
feat(loader): Make the default for new js projects v5 of js sdk (#13327)
build: Remove browser-reload flag (#13918)
ref(ui): Consolidate server frontend hydration logic (#13868)
ref: Refactor user reports to not use Postgres Event (#13904)
Test/integration acceptance tests (#13895)
feat: Remove ts-jest (#13846)
obs(sentry_apps): Add a small metrics increment on processing resource changes. (#13897)
enable testing for all orgs (#13903)
ref: Update Python SDK to 0.10.0 (#13911)
fix: Do not suggest Sentry.Extensions.Logging when ASP.NET Core is used (#13891)
Update license year to 2019
ci(travis): Move docker-sentry builds to Dockes Hub autobuild (#13901)
ref(app-platform): Add integration features to SentryAppDetailsModal (#13393)
chore(ui) Rename OrganizationStream to IssueList (#13892)
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MeredithAnya@mnoble@evanpurkhiser@scefali
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ref(app-platform): Add integration features to SentryAppDetailsModal - #13393

Merged
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal
Jul 5, 2019
Merged

ref(app-platform): Add integration features to SentryAppDetailsModal#13393
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal

Conversation

@MeredithAnya

Copy link
Copy Markdown
Member

Depends on #13377

Screen Shot 2019-05-24 at 10 35 22 AM

@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from a50ae9f to 144968bCompareJune 5, 2019 18:09
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch 4 times, most recently from d732b1a to 10db914CompareJune 21, 2019 18:32
@MeredithAnya
MeredithAnya requested a review from mnobleJune 21, 2019 20:05

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should add some tests ensuring the installation button is disabled, based on the IntegrationFeature.

const featureListHooks = HookStore.get('integrations:feature-gates');
featureListHooks.push(() => defaultFeatureGateComponents);

const {FeatureList, IntegrationFeatures} = featureListHooks[0]();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions (do you know why?). Then we're adding defaultFeatureGateComponents to it. Then we're calling the first item in that list? Is the push in case it returns an empty list?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the defaultFeatureGateComponent list for if you are just running sentry to make this compatible for on-prem people.

Is the push in case it returns an empty list?

This is so we use the pretty markdown and plan specific information for sentry.io

I forget exactly know how the HookStore works so maybe @evanpurkhiser can shed light on the 'returns list of functions' question.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MeredithAnya I agree with @mnoble that the code makes this a bit confusing to understand what's going on, though I see this is used other places in the code base. I'm wondering if there is a clearer way to get the same behavior. Here is my suggestion:

const featureHook = HookStore.get('integrations:feature-gates')[0] || defaultFeatureGateComponents;
const {FeatureList, IntegrationFeatures} = featureHook();

This also avoids mutating the array that is stored in the HookStore with key integrations:feature-gates. The mutation probably does not have any consequences in this case but in general, it's better to avoid mutation unless that is the explicit goal.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was my doing.

Yes we push it onto the end in the case that it's empty.

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||defaultFeatureGateComponents;

This would need to be written as

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||(()=>defaultFeatureGateComponents);

Since we call the hookstore function to get our components back.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions

This is historically just the convention that we have typically used for hookstore. I think it's not great considering there are actually a lot of times where we do not want a list. In fact, if you look around the code base, I would say a majority of the times we just pop off the first function and call it.

@scefaliscefaliJul 3, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@evanpurkhiser Does it make sense to make a getFirst method on the HookStore? Probably outside the scope of this PR but if what you are saying is true then getting the full array is just a hassle.

EDIT:
Maybe even have a getFirstAndCall method so we can take care of calling the method as well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would probably make more sense to re-evaluate how we're using hookstore. Not sure how much you've seen it yet, but it's basically a bridge between sentry and getsentry, a way to add frontend features specific to the SASS product

@MeredithAnya
MeredithAnya requested a review from scefaliJuly 2, 2019 16:56
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from 10db914 to eacf461CompareJuly 2, 2019 17:17
Comment threadsrc/sentry/static/sentry/app/components/modals/sentryAppDetailsModal.jsx Outdated
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from eacf461 to 260770dCompareJuly 2, 2019 23:10

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd update that one section to what @scefali suggested, get this on staging again, and then I think we're good.

@MeredithAnya
MeredithAnya merged commit e873279 into masterJul 5, 2019
@MeredithAnya
MeredithAnya deleted the app-platform/integration-features-modal branch July 5, 2019 17:56
jan-auer added a commit that referenced this pull request Jul 9, 2019
* master:
chore: Fix typo errywhere -> everywhere (#13934)
ref: (Django 1.9) Bump djangorestframework to 3.0.5 as an intermediate step to get to 3.3.x
feat(issueless events): Test eventstream work without groups (#13888)
ref: Improve repr of User (#13896)
feat(loader): Make the default for new js projects v5 of js sdk (#13327)
build: Remove browser-reload flag (#13918)
ref(ui): Consolidate server frontend hydration logic (#13868)
ref: Refactor user reports to not use Postgres Event (#13904)
Test/integration acceptance tests (#13895)
feat: Remove ts-jest (#13846)
obs(sentry_apps): Add a small metrics increment on processing resource changes. (#13897)
enable testing for all orgs (#13903)
ref: Update Python SDK to 0.10.0 (#13911)
fix: Do not suggest Sentry.Extensions.Logging when ASP.NET Core is used (#13891)
Update license year to 2019
ci(travis): Move docker-sentry builds to Dockes Hub autobuild (#13901)
ref(app-platform): Add integration features to SentryAppDetailsModal (#13393)
chore(ui) Rename OrganizationStream to IssueList (#13892)
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MeredithAnya@mnoble@evanpurkhiser@scefali
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

ref(app-platform): Add integration features to SentryAppDetailsModal - #13393

Merged
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal
Jul 5, 2019
Merged

ref(app-platform): Add integration features to SentryAppDetailsModal#13393
MeredithAnya merged 6 commits into
masterfrom
app-platform/integration-features-modal

Conversation

@MeredithAnya

Copy link
Copy Markdown
Member

Depends on #13377

Screen Shot 2019-05-24 at 10 35 22 AM

@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from a50ae9f to 144968bCompareJune 5, 2019 18:09
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch 4 times, most recently from d732b1a to 10db914CompareJune 21, 2019 18:32
@MeredithAnya
MeredithAnya requested a review from mnobleJune 21, 2019 20:05

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should add some tests ensuring the installation button is disabled, based on the IntegrationFeature.

const featureListHooks = HookStore.get('integrations:feature-gates');
featureListHooks.push(() => defaultFeatureGateComponents);

const {FeatureList, IntegrationFeatures} = featureListHooks[0]();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions (do you know why?). Then we're adding defaultFeatureGateComponents to it. Then we're calling the first item in that list? Is the push in case it returns an empty list?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the defaultFeatureGateComponent list for if you are just running sentry to make this compatible for on-prem people.

Is the push in case it returns an empty list?

This is so we use the pretty markdown and plan specific information for sentry.io

I forget exactly know how the HookStore works so maybe @evanpurkhiser can shed light on the 'returns list of functions' question.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MeredithAnya I agree with @mnoble that the code makes this a bit confusing to understand what's going on, though I see this is used other places in the code base. I'm wondering if there is a clearer way to get the same behavior. Here is my suggestion:

const featureHook = HookStore.get('integrations:feature-gates')[0] || defaultFeatureGateComponents;
const {FeatureList, IntegrationFeatures} = featureHook();

This also avoids mutating the array that is stored in the HookStore with key integrations:feature-gates. The mutation probably does not have any consequences in this case but in general, it's better to avoid mutation unless that is the explicit goal.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was my doing.

Yes we push it onto the end in the case that it's empty.

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||defaultFeatureGateComponents;

This would need to be written as

constfeatureHook=HookStore.get('integrations:feature-gates')[0]||(()=>defaultFeatureGateComponents);

Since we call the hookstore function to get our components back.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what the above code is doing. It looks like HookStore returns a list of functions

This is historically just the convention that we have typically used for hookstore. I think it's not great considering there are actually a lot of times where we do not want a list. In fact, if you look around the code base, I would say a majority of the times we just pop off the first function and call it.

@scefaliscefaliJul 3, 2019

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@evanpurkhiser Does it make sense to make a getFirst method on the HookStore? Probably outside the scope of this PR but if what you are saying is true then getting the full array is just a hassle.

EDIT:
Maybe even have a getFirstAndCall method so we can take care of calling the method as well.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would probably make more sense to re-evaluate how we're using hookstore. Not sure how much you've seen it yet, but it's basically a bridge between sentry and getsentry, a way to add frontend features specific to the SASS product

@MeredithAnya
MeredithAnya requested a review from scefaliJuly 2, 2019 16:56
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from 10db914 to eacf461CompareJuly 2, 2019 17:17
Comment threadsrc/sentry/static/sentry/app/components/modals/sentryAppDetailsModal.jsx Outdated
@MeredithAnya
MeredithAnyaforce-pushed the app-platform/integration-features-modal branch from eacf461 to 260770dCompareJuly 2, 2019 23:10

@mnoblemnoble left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd update that one section to what @scefali suggested, get this on staging again, and then I think we're good.

@MeredithAnya
MeredithAnya merged commit e873279 into masterJul 5, 2019
@MeredithAnya
MeredithAnya deleted the app-platform/integration-features-modal branch July 5, 2019 17:56
jan-auer added a commit that referenced this pull request Jul 9, 2019
* master:
chore: Fix typo errywhere -> everywhere (#13934)
ref: (Django 1.9) Bump djangorestframework to 3.0.5 as an intermediate step to get to 3.3.x
feat(issueless events): Test eventstream work without groups (#13888)
ref: Improve repr of User (#13896)
feat(loader): Make the default for new js projects v5 of js sdk (#13327)
build: Remove browser-reload flag (#13918)
ref(ui): Consolidate server frontend hydration logic (#13868)
ref: Refactor user reports to not use Postgres Event (#13904)
Test/integration acceptance tests (#13895)
feat: Remove ts-jest (#13846)
obs(sentry_apps): Add a small metrics increment on processing resource changes. (#13897)
enable testing for all orgs (#13903)
ref: Update Python SDK to 0.10.0 (#13911)
fix: Do not suggest Sentry.Extensions.Logging when ASP.NET Core is used (#13891)
Update license year to 2019
ci(travis): Move docker-sentry builds to Dockes Hub autobuild (#13901)
ref(app-platform): Add integration features to SentryAppDetailsModal (#13393)
chore(ui) Rename OrganizationStream to IssueList (#13892)
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Dec 20, 2020
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MeredithAnya@mnoble@evanpurkhiser@scefali